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

📄 at91_serial_fixup.c

📁 AT91SAM9260usart485功能的使能驱动
💻 C
字号:
#include <stdio.h>#include <stdarg.h>#include <memory.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/mman.h>#include <sys/ioctl.h>#include <fcntl.h>#include <signal.h>#include "at91_serial_fixup.h"int fd;void *map_base, *virt_addr; static void at91_write(unsigned int addr, unsigned int val){	*((unsigned long*)(map_base + (addr & MAP_MASK))) = val;}static unsigned int at91_read(unsigned int addr){	return(*((unsigned long*)(map_base + (addr & MAP_MASK)))); }static void usart0_as_rs232(void){	unsigned int mr;		mr = at91_read(AT91C_US0_OFFSET+AT91C_US_MR);	mr &= ~AT91C_US_USMODE;	mr |= AT91C_US_USMODE_NORMAL;	at91_write(AT91C_US0_OFFSET+AT91C_US_MR, mr);	at91_write(AT91C_US0_OFFSET+AT91C_US_TTGR, 0);			printf("Set USART0 (/dev/ttyS1) to RS-232 mode\n");}static void usart1_as_rs232(void){	unsigned int mr;		mr = at91_read(AT91C_US1_OFFSET+AT91C_US_MR);	mr &= ~AT91C_US_USMODE;	mr |= AT91C_US_USMODE_NORMAL;	at91_write(AT91C_US1_OFFSET+AT91C_US_MR, mr);	at91_write(AT91C_US1_OFFSET+AT91C_US_TTGR, 0);			printf("Set USART1 (/dev/ttyS2) to RS-232 mode\n");	}static void usart1_as_rs485(void){	unsigned int mr;		mr = at91_read(AT91C_US1_OFFSET+AT91C_US_MR);	mr &= ~AT91C_US_USMODE;	mr |= AT91C_US_USMODE_RS485;	at91_write(AT91C_US1_OFFSET+AT91C_US_MR, mr);	at91_write(AT91C_US1_OFFSET+AT91C_US_TTGR, DEFAULT_TGGR_VAL);			printf("Set USART1 (/dev/ttyS2) to RS-485 mode\n");	}static void usart2_as_rs232(void){	unsigned int mr;		mr = at91_read(AT91C_US2_OFFSET+AT91C_US_MR);	mr &= ~AT91C_US_USMODE;	mr |= AT91C_US_USMODE_NORMAL;	at91_write(AT91C_US2_OFFSET+AT91C_US_MR, mr);	at91_write(AT91C_US2_OFFSET+AT91C_US_TTGR, 0);		at91_write(AT91C_PIOA_OFFSET+AT91C_PIO_PDR, AT91C_PA31_RTS2);	at91_write(AT91C_PIOA_OFFSET+AT91C_PIO_ASR, AT91C_PA31_RTS2);		printf("Set USART2 (/dev/ttyS3) to RS-232 mode\n");		printf("Note: Console ouput on DBGU (/dev/ttyS0) enabled\n");	printf("Note: Hardware flow control for USART2 (/dev/ttyS3) unavailable\n");}static void usart2_as_rs485(void){	unsigned int mr;		mr = at91_read(AT91C_US2_OFFSET+AT91C_US_MR);	mr &= ~AT91C_US_USMODE;	mr |= AT91C_US_USMODE_RS485;	at91_write(AT91C_US2_OFFSET+AT91C_US_MR, mr);	at91_write(AT91C_US2_OFFSET+AT91C_US_TTGR, DEFAULT_TGGR_VAL);		at91_write(AT91C_PIOA_OFFSET+AT91C_PIO_PDR, AT91C_PA31_RTS2);	at91_write(AT91C_PIOA_OFFSET+AT91C_PIO_BSR, AT91C_PA31_RTS2);		printf("Set USART2 (/dev/ttyS3) to RS-485 mode\n");	printf("Note: console ouput on DBGU (/dev/ttyS0) disabled\n");}static void usart3_as_rs232(void){	unsigned int mr;		mr = at91_read(AT91C_US3_OFFSET+AT91C_US_MR);	mr &= ~AT91C_US_USMODE;	mr |= AT91C_US_USMODE_NORMAL;	at91_write(AT91C_US3_OFFSET+AT91C_US_MR, mr);	at91_write(AT91C_US3_OFFSET+AT91C_US_TTGR, 0);		printf("Set USART3 (/dev/ttyS4) to RS-232 mode\n");}static void usart3_as_rs485(void){	unsigned int mr;		mr = at91_read(AT91C_US3_OFFSET+AT91C_US_MR);	mr &= ~AT91C_US_USMODE;	mr |= AT91C_US_USMODE_RS485;	at91_write(AT91C_US3_OFFSET+AT91C_US_MR, mr);	at91_write(AT91C_US3_OFFSET+AT91C_US_TTGR, DEFAULT_TGGR_VAL);		at91_write(AT91C_PIOB_OFFSET+AT91C_PIO_PDR, AT91C_PB0_RTS3);	at91_write(AT91C_PIOB_OFFSET+AT91C_PIO_BSR, AT91C_PB0_RTS3);		printf("Set USART3 (/dev/ttyS4) to RS-485 mode\n");}int main(int argc, char *argv[]){	int i, rc, pin, dest_addr, id, retval, mode;	char *current, action, port, *smode;	unsigned long readval, writeval;		if(argc < 2){		printf("\nAT91RM9200 user-space serial fixup for SPKM-303 (c) 2005 roman <avr@zniis.ru>\n\n");		printf("Usage: at91_serial_fixup PORT:MODE [PORT:MODE] ...\n");		printf("Where: PORT=ttyS1..ttyS4  MODE=232 or 485\n");		printf("Example: at91_serial_fixup ttyS1:232 ttyS3:485 ttyS4:485\n");		printf("(set ttyS1 as RS-232, ttyS3 as RS-485 and ttyS4 as RS-485)\n");		printf("\n");		exit(0);	}    	if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1){		printf("at91_serial_fixup: Error opening /dev/mem\n");		exit(-1);	}		/* Map system memory */	map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MAP_BASE & ~MAP_MASK);	if(map_base == (void *) -1){		printf("at91_serial_fixup: Error mapping memory at 0x%08x\n", MAP_BASE & ~MAP_MASK);		close(fd);		exit(-1);	}		for(i=1; i < argc; i++){		rc = 0;		current = argv[i];		if(!isdigit(current[0])){			if(!isdigit(current[4])){				rc = -1;			} else {				port = current[4];				current = &current[4];			}		} else {			port = current[0];		}		if(current[1] != ':') rc = -1;		smode = &current[2];		if(!strncmp(smode, "232", 3))			mode = 232;		else if(!strncmp(smode, "485", 3))			mode = 485;		else 			mode = 0;			if(rc){			printf("at91_serial_fixup: Error in given argument '%s'\n", current);			continue;		}		switch(port){			case '1':				if(mode == 232)					usart0_as_rs232();				else if(mode == 485) {					printf("RS-485 mode for USART0 (/dev/ttyS1) is not supported (errata #39)\n");				} else					printf("at91_serial_fixup: Invalid mode value %s\n", smode);				break;			case '2':				if(mode == 232)					usart1_as_rs232();				else if(mode == 485)					usart1_as_rs485();				else							printf("at91_serial_fixup: Invalid mode value %s\n", smode);				break;			case '3':				if(mode == 232)					usart2_as_rs232();				else if(mode == 485)					usart2_as_rs485();				else							printf("at91_serial_fixup: Invalid mode value %s\n", smode);				break;			case '4':				if(mode == 232)					usart3_as_rs232();				else if(mode == 485)					usart3_as_rs485();				else							printf("at91_serial_fixup: Invalid mode value %s\n", smode);				break;			default:				printf("at91_serial_fixup: Invalid port value %c\n", port);							}	}		/* Unmap previously mapped page */	if(munmap(map_base, MAP_SIZE) == -1){		printf("at91_serial_fixup: Error unmapping memory\n");		close(fd);		exit(-1);	}	    close(fd);	exit(retval);}

⌨️ 快捷键说明

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