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

📄 moxaload.c

📁 moxa多串口卡linux下的驱动源码
💻 C
字号:
/********************************************************************** * moxaload.c *	Firmware Download Utility for MOXA Multiport Card	 *	by Emily Wu * *	Copyright (c) 404 Technologies Inc. 1994. All Rights Reserved. * History: *	Kevin Li 6/94	get_os_info() *	Kevin Li 12/94	merge Solaris's moxaload.c *	Victor   07/96	modified. for V3.0 *	Casper	12/30/98 modified for linux ,5.0 *      Casper  07/20/99 modified for ver 5.1 *********************************************************************/#include	<sys/types.h>#include	<termios.h>#include	<stdio.h>#include	<fcntl.h>#include	<unistd.h>#include	<sys/errno.h>#include	"moxaadm.h"typedef unsigned char	uchar;extern int	errno;#define BIOS		0#define TTYS		1#define COMM		2#define MINSLEEPTIME	2#define ABIOS	0#define BTTYS	1#define BCOMM	2#define ATTYS	3#define ACOMM	4#define FIRMWARE_HEADER_LEN	32char	*szBoard[] = {        "",        "C218 Turbo/PCI",        "C218 Turbo",        "C320 Turbo/PCI",        "C320 Turbo",        "CP-204J"};moxa_board_conf	conf[4];MOXA_PCI_Config	pciconf;int		pcinotset,pciboardset[C218320_MAXCARD];int		pciindex[C218320_MAXCARD], memconflict[C218320_MAXCARD];uchar		cardtype[C218320_MAXCARD], cardtype1[C218320_MAXCARD];struct dl_str {	uchar	*buf;	int	len;	int	cardno;};struct dl_str	dl_blk;int		fd, ffd;uchar		c218_bios[8192];uchar		c320_bios[8192];uchar		cp204_bios[8192];uchar		c218ttys_buf[10240];uchar		c218comm_buf[10240];uchar		cp204comm_buf[10240];uchar		c320bttys_buf[10240];uchar		c320bcomm_buf[10240];uchar		c320attys_buf[10240];uchar		c320acomm_buf[10240];char c218_file[] = "/usr/lib/moxa/c218tunx.cod";char c320_file[] = "/usr/lib/moxa/c320tunx.cod";char cp204_file[] = "/usr/lib/moxa/cp204unx.cod";char		moxa_card;int		c218_len[3];		/* BIOS, TTYS, COMM */int		cp204_len[3];		/* BIOS, TTYS, COMM */int		c320_len[5];	/* ABIOS, BTTYS, BCOMM... */char		c218flag=0, c320flag=0,cp204flag=0;char		fail[C218320_MAXCARD];int		SleepTime = MINSLEEPTIME;void cp204file();void c218file();void c320file();void ld204comm(int cardno);void ld218comm(int cardno);void ld320comm(int cardno);void func_load(int cardno);int  main(int argc, char *argv[]){	int	i, j, k, len, errflag[C218320_MAXCARD];	char	buf[30];        	if (argc < 2 || argv[1][0] != '-' || argv[1][1] != 'y')		exit(1);                	if (argc == 3)		sscanf(argv[2], "%d", &SleepTime);	if (SleepTime < MINSLEEPTIME )		SleepTime = MINSLEEPTIME;	for (i=0; i<C218320_MAXCARD; i++)		fail[i] = 0;	if ((fd = open("/dev/moxa", O_RDWR)) < 0) {		printf("ERROR! open /dev/moxa failure.\n");		errexit();	}	i = ioctl(fd, MOXA_GET_CONF, &conf);	for ( i=0; i<C218320_MAXCARD; i++ ) {	    if ( (conf[i].boardType == C218TPCI) ||	         ( conf[i].boardType == C218TISA)) {		c218flag = 1;		cardtype1[i] = C218TSERIES;	    }	    else if ( (conf[i].boardType == C320TPCI) ||	         ( conf[i].boardType == C320TISA)) {		c320flag = 1;		cardtype1[i] = C320TSERIES;	    }	    else if (conf[i].boardType == CP204J) {		cp204flag = 1;		cardtype1[i] = CP204JSERIES;	    }	    else		cardtype1[i] = 0;	}	if ( c218flag )		c218file();	if ( c320flag )		c320file();	if ( cp204flag )		cp204file();	for (i = 0;i < C218320_MAXCARD;i++) {	    memconflict[i] = 0;	}	for (i = 0;i < C218320_MAXCARD; i++) {	    if ( !conf[i].boardType ) 	        continue;	    for (j = i+1;j < C218320_MAXCARD;j++) {		if ( !conf[j].boardType )		    continue;		    if ( conf[i].baseAddr == conf[j].baseAddr) {			    memconflict[i] = 1;			    memconflict[j] = 1;		    }	    }	}	if ( i < 0 ) {		close(fd);		printf("Ioctl control error for card configuration !\n");		errexit();	}/* Call clear card */	i = 0x404;        if (ioctl(fd, MOXA_INIT_DRIVER, &i) == -1) {		printf("MOXA device ioctl (LCLRCARD) error\n");		errexit();        }	for ( i=0; i<C218320_MAXCARD; i++ ) {	    if ( cardtype1[i] )	/* load bios and find the card */		switch ( cardtype1[i] ) {		case C218TSERIES:		     dl_blk.buf = c218_bios;		     dl_blk.len = c218_len[BIOS];		     dl_blk.cardno = i;		     if (ioctl(fd, MOXA_LOAD_BIOS, &dl_blk) == -1) {			printf("MOXA device ioctl (MOXA_LOAD_BIOS) error\n");			errexit();		     }		     break;		case C320TSERIES:		/* C320 */		     dl_blk.buf = c320_bios;		     dl_blk.len = c320_len[ABIOS];		     dl_blk.cardno = i;		     if (ioctl(fd, MOXA_LOAD_BIOS, &dl_blk) == -1) {			printf("MOXA device ioctl (MOXA_LOAD_BIOS) error\n");			errexit();		     }		     break;		case CP204JSERIES:		     dl_blk.buf = cp204_bios;		     dl_blk.len = cp204_len[BIOS];		     dl_blk.cardno = i;		     if (ioctl(fd, MOXA_LOAD_BIOS, &dl_blk) == -1) {			printf("MOXA device ioctl (MOXA_LOAD_BIOS) error\n");			errexit();		     }		     break;		}	}	printf("Intellio Series device driver (Ver. %s)\n", MOXA_VER);	printf("Downloading ......\n");	sleep(SleepTime);	for (i=0; i<C218320_MAXCARD; i++)	    if ( cardtype1[i] ) {		if (conf[i].busType == 1)		    sprintf (buf,"BusNo=%d,DevNo=%d",conf[i].Pci.BusNum,conf[i].Pci.DevNum);		else		    sprintf (buf,"MemBank=%x",conf[i].baseAddr);		if ( memconflict[i] ) {		    printf ("WARNING! MOXA %s(%s) MemBank conflict.\n",szBoard[conf[i].boardType], buf);		    continue;		}		if ( pciindex[i] == -1) {		    printf("WARNING! MOXA %s(%s) not found.\n",szBoard[conf[i].boardType], buf);		    continue;		}		dl_blk.cardno = i;		if (ioctl(fd, MOXA_FIND_BOARD, &dl_blk) == -1) {	            if (errno == 1) {		        printf("WARNING! MOXA %s(%s) not found.\n",szBoard[conf[i].boardType], buf);                    }else if (errno == 2){		        printf("WARNING! MOXA %s(%s) CPU/Basic module not found.\n",szBoard[conf[i].boardType], buf);                    }                    fail[i] = 1;		}                		if ( fail[i] == 0 ) 		    printf("Board %2d: MOXA %s(%s) is found.\n", i+1, szBoard[conf[i].boardType], buf);		if (fail[i] == 0 && (cardtype1[i] != C218TSERIES) && (cardtype1[i] != CP204JSERIES)) {			dl_blk.buf = c320bcomm_buf;			dl_blk.len = c320_len[BCOMM];			dl_blk.cardno = i;			if (ioctl(fd, MOXA_LOAD_C320B, &dl_blk) == -1) {			   printf("WARNING! MOXA device ioctl (MOXA_LOAD_C320B) error\n");			   errexit();			}		}	    }            	for (i=0; i<C218320_MAXCARD; i++) {	    if ( memconflict[i] )		continue;	    if (fail[i] == 0) {		switch ( cardtype1[i] ) {		case C218TSERIES:		     ld218comm(i);		     break;		case C320TSERIES:		     ld320comm(i);		     break;		case CP204JSERIES:		     ld204comm(i);		     break;		}	    }	}	return 0;	}void cp204file(){	int	j, len;	if ((ffd = open(cp204_file, O_RDWR)) == -1) {		printf("ERROR! Firmware file (%s) not found.\n", cp204_file);		errexit();	}	if (read(ffd, cp204_bios, FIRMWARE_HEADER_LEN) != FIRMWARE_HEADER_LEN) {		printf("ERROR! Firmware file (%s) read error.\n", cp204_file);		errexit();	}	if ((cp204_bios[0]=='4')&&(cp204_bios[1]=='0')&&(cp204_bios[2]=='4') &&		(cp204_bios[3] == '0') 		/* Magic Code */		&& (cp204_bios[6] == 3)  	/* UNIX type */		&& (cp204_bios[7] == 3) 	/* CP-204J */		) {	    for (j=0; j<3; j++) {		cp204_len[j] = cp204_bios[17+j*2];		cp204_len[j] <<= 8;		cp204_len[j] += cp204_bios[16+j*2];	    }	} else {		printf("ERROR! Firmware file (%s) format error.\n", cp204_file);		errexit();	}	len = read(ffd, cp204_bios, cp204_len[BIOS]);	if (len != cp204_len[BIOS]) {		printf("ERROR! Firmware file (%s) read error.\n", cp204_file);		errexit();	}	len = read(ffd, cp204comm_buf, cp204_len[TTYS]);	if (len != cp204_len[TTYS]) {		printf("ERROR! Firmware file (%s) read error.\n", cp204_file);		errexit();	}	len = read(ffd, cp204comm_buf, cp204_len[COMM]);	if (len != cp204_len[COMM]) {		printf("ERROR! Firmware file (%s) read error.\n", cp204_file);		errexit();	}	close(ffd);}void c218file(){	int	j, len;	if ((ffd = open(c218_file, O_RDWR)) == -1) {		printf("ERROR! Firmware file (%s) not found.\n", c218_file);		errexit();	}	if (read(ffd, c218_bios, FIRMWARE_HEADER_LEN) != FIRMWARE_HEADER_LEN) {		printf("ERROR! Firmware file (%s) read error.\n", c218_file);		errexit();	}	if ((c218_bios[0]=='4')&&(c218_bios[1]=='0')&&(c218_bios[2]=='4') &&		(c218_bios[3] == '0') 		/* Magic Code */		&& (c218_bios[6] == 3)  	/* UNIX type */		&& (c218_bios[7] == 1) 		/* C218Turbo */		) {	    for (j=0; j<3; j++) {		c218_len[j] = c218_bios[17+j*2];		c218_len[j] <<= 8;		c218_len[j] += c218_bios[16+j*2];	    }	} else {		printf("ERROR! Firmware file (%s) format error.\n", c218_file);		errexit();	}	len = read(ffd, c218_bios, c218_len[BIOS]);	if (len != c218_len[BIOS]) {		printf("ERROR! Firmware file (%s) read error.\n", c218_file);		errexit();	}	len = read(ffd, c218ttys_buf, c218_len[TTYS]);	if (len != c218_len[TTYS]) {		printf("ERROR! Firmware file (%s) read error.\n", c218_file);		errexit();	}	len = read(ffd, c218comm_buf, c218_len[COMM]);	if (len != c218_len[COMM]) {		printf("ERROR! Firmware file (%s) read error.\n", c218_file);		errexit();	}	close(ffd);}void c320file(){	int	j, len;	if ((ffd = open(c320_file, O_RDWR)) == -1) {		printf("ERROR! Firmware file (%s) not found.\n", c320_file);		errexit();	}	if (read(ffd, c320_bios, FIRMWARE_HEADER_LEN) != FIRMWARE_HEADER_LEN) {		printf("ERROR! Firmware file (%s) read error.\n", c320_file);		errexit();	}	if ((c320_bios[0]=='4')&&(c320_bios[1]=='0')&&(c320_bios[2]=='4') &&		(c320_bios[3] == '0') 		/* Magic Code */		&& (c320_bios[6] == 3) 		/* UNIX type */		&& (c320_bios[7] == 2) 		/* C320Turbo */		) {	    for (j=0; j<5; j++) {		c320_len[j] = c320_bios[17+j*2];		c320_len[j] <<= 8;		c320_len[j] += c320_bios[16+j*2];	    }	} else {		printf("ERROR! Firmware file (%s) format error.\n", c320_file);		errexit();	}	len = read(ffd, c320_bios, c320_len[ABIOS]);	if (len != c320_len[ABIOS]) {		printf("ERROR! Firmware file (%s) read error.\n", c320_file);		errexit();	}	len = read(ffd, c320bttys_buf, c320_len[BTTYS]);	if (len != c320_len[BTTYS]) {		printf("ERROR! Firmware file (%s) read error.\n", c320_file);		errexit();	}	len = read(ffd, c320bcomm_buf, c320_len[BCOMM]);	if (len != c320_len[BCOMM]) {		printf("ERROR! Firmware file (%s) read error.\n", c320_file);		errexit();	}	len = read(ffd, c320attys_buf, c320_len[ATTYS]);	if (len != c320_len[ATTYS]) {		printf("ERROR! Firmware file (%s) read error.\n", c320_file);		errexit();	}	len = read(ffd, c320acomm_buf, c320_len[ACOMM]);	if (len != c320_len[ACOMM]) {		printf("ERROR! Firmware file (%s) read error.\n", c320_file);		errexit();	}	close(ffd);}void ld204comm(int cardno){	int	i, len;	len = ((cp204_len[COMM] + 1) >> 1) << 1;	dl_blk.buf = cp204comm_buf;	dl_blk.len = len;	dl_blk.cardno = cardno;	func_load(cardno);}void ld218comm(int cardno){	int	i, len;	len = ((c218_len[COMM] + 1) >> 1) << 1;	dl_blk.buf = c218comm_buf;	dl_blk.len = len;	dl_blk.cardno = cardno;	func_load(cardno);}void ld218ttys(int cardno){	int	i, len;	len = ((c218_len[TTYS] + 1) >> 1) << 1;	dl_blk.buf = c218ttys_buf;	dl_blk.len = len;	dl_blk.cardno = cardno;	func_load(cardno);}void ld320comm(int cardno){	int	i;	dl_blk.buf = c320acomm_buf;	dl_blk.len = c320_len[ACOMM];	dl_blk.cardno = cardno;	func_load(cardno);}void ld320ttys(int cardno){	int	i;	dl_blk.buf = c320attys_buf;	dl_blk.len = c320_len[ATTYS];	dl_blk.cardno = cardno;	func_load(cardno);}void func_load(int cardno){	if (ioctl(fd, MOXA_LOAD_CODE, &dl_blk) == -1) {	   if (errno == EFAULT)	       printf("ERROR! MOXA %s (%x) download fail.\n", szBoard[conf[cardno].boardType], conf[cardno].baseAddr);	   else if (errno == 100)	       printf("ERROR! MOXA %s (%x) CPU/Basic module download fail.\n", szBoard[conf[cardno].boardType], conf[cardno].baseAddr);	   else	       printf("ERROR! MOXA %s (%x) UART module not found.\n", szBoard[conf[cardno].boardType], conf[cardno].baseAddr);	}}errexit(){	printf("MOXA serial I/O Board initialization failure.\n\n");	exit(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -