⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 install_ss.c

📁 pci-serial.rar是 PCI转串口驱动程序
💻 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 + -