📄 install_ss.c
字号:
#include <stdio.h>#include <pci/pci.h>#include <unistd.h>#include <sys/types.h>#include <fcntl.h>#include <string.h>#include <termios.h>#include <linux/serial.h>#include <asm/ioctls.h>#define MAX_IO_BASE 8 #define MAX_IRQ 4static struct pci_access *pacc;static struct pci_filter fliter;int count=0;//inster board numbers unsigned int ioaddress[MAX_IO_BASE];int irq[MAX_IRQ];int baud_base=115200;int uart=PORT_16550A;void set_serial(char *device, unsigned int port, int uart, int irq,int baud_base){ struct serial_struct old_serinfo, new_serinfo; int fd; if ((fd = open(device, O_RDWR|O_NONBLOCK)) < 0) { perror(device); exit(201); } if (ioctl(fd, TIOCGSERIAL, &old_serinfo) < 0) { perror("Cannot get serial info"); exit(1); } new_serinfo = old_serinfo; new_serinfo.port = port; new_serinfo.irq = irq; new_serinfo.type = uart; if (new_serinfo.type < 0) { printf("Illegal UART type!\n"); exit(1); } new_serinfo.baud_base = baud_base; if (ioctl(fd, TIOCSSERIAL, &new_serinfo) < 0) { perror("Cannot set serial info"); exit(1); } close(fd);}static void scan_devices(void){ struct pci_dev *p; unsigned int vendor; unsigned short status; pci_scan_bus(pacc); for(p=pacc->devices;p;p=p->next) { if( (pci_read_word(p,0x10)&1) && (pci_read_word(p,0x14)&1) && (pci_read_word(p,0x40)==pci_read_word(p,0x44)) && (pci_read_word(p,0x42)==0x8000) && (pci_read_word(p,0x46)==0x0000))//find CH352 { ioaddress[2*count]=p->base_addr[0]; ioaddress[2*count+1]=p->base_addr[1]; irq[count]=p->irq; count++; } }}int main(void){ char *dev1="/dev/ttyS2"; char *dev2="/dev/ttyS3"; char *dev3="/dev/ttyS4"; char *dev4="/dev/ttyS5"; char *dev5="/dev/ttyS6"; char *dev6="/dev/ttyS7"; char *dev7="/dev/ttyS8"; char *dev8="/dev/ttyS9"; pacc=pci_alloc(); pci_filter_init(pacc,&fliter); pci_init(pacc); scan_devices(); switch(count) { case 0: break;//don't find CH352 case 1: set_serial(dev1,ioaddress[0]-1,uart,irq[0],baud_base);//find one CH352 set_serial(dev2,ioaddress[1]-1,uart,irq[0],baud_base); break; case 2: set_serial(dev1,ioaddress[0]-1,uart,irq[0],baud_base);//find two CH352 set_serial(dev2,ioaddress[1]-1,uart,irq[0],baud_base); set_serial(dev3,ioaddress[2]-1,uart,irq[1],baud_base); set_serial(dev4,ioaddress[3]-1,uart,irq[1],baud_base); break; case 3: set_serial(dev1,ioaddress[0]-1,uart,irq[0],baud_base);//find three CH352 set_serial(dev2,ioaddress[1]-1,uart,irq[0],baud_base); set_serial(dev3,ioaddress[2]-1,uart,irq[1],baud_base); set_serial(dev4,ioaddress[3]-1,uart,irq[1],baud_base); set_serial(dev5,ioaddress[4]-1,uart,irq[2],baud_base); set_serial(dev6,ioaddress[5]-1,uart,irq[2],baud_base); break; case 4: set_serial(dev1,ioaddress[0]-1,uart,irq[0],baud_base);//find four CH352 set_serial(dev2,ioaddress[1]-1,uart,irq[0],baud_base); set_serial(dev3,ioaddress[2]-1,uart,irq[1],baud_base); set_serial(dev4,ioaddress[3]-1,uart,irq[1],baud_base); set_serial(dev5,ioaddress[4]-1,uart,irq[2],baud_base); set_serial(dev6,ioaddress[5]-1,uart,irq[2],baud_base); set_serial(dev7,ioaddress[6]-1,uart,irq[3],baud_base); set_serial(dev8,ioaddress[7]-1,uart,irq[3],baud_base); defaule:break; } pci_cleanup(pacc); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -