📄 at91_serial_fixup.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 = ¤t[4]; } } else { port = current[0]; } if(current[1] != ':') rc = -1; smode = ¤t[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 + -