4 M高速UARTテスト

4767 ワード

チップマニュアルでは低速UARTはFIFO、高速UARTはBAM(Bus Access Manager?)に基づいている.高速UART Baudrates 300 bps up to 4 M bps、これは憂鬱で、sttyもこんなに高い設定をサポートしていないでしょう.そしてハードウェアエンジニアは一時的に4 MHzをサポートするハードウェアを見つけてテストしませんでしたが、テストはこのようにBUGを提出しました.
シナリオ1:sttyのソースコードを修正してコンパイルし、sttyのソースコードstty.c busyboxのcoreutilsディレクトリの下にあります.
方案2:ネット上でuar tを探して4 MHzのテストコードをサポートする.
明らかにシナリオ2はもっと簡潔で、UARTのテストコードを見つけたが、ボーレートは4 MHzをサポートしていないので、大丈夫だ.修正すればいい.
クロスコンパイルツールでuart-testを生成し、テストを開始します.
adb push uart-test /var
sh-4.3# chmod 777 /var/uart-test
sh-4.3# /var/uart-test /dev/ttyHS0 4000000 0
Start...
Open...
set baud success
Sending...
2 send data successful
Close...
Watch the waveform of RX Pin, the data byte cycle should be near to 250 ns

テストが完了しました.
次はUARTのテストコードuart-testです.c
#include   
#include   
#include   
#include   
#include 
#include 
#include 
#include 
#include 

  
#define FALSE  -1  
#define TRUE   0  
////////////////////////////////////////////////////////////////////////////////  
/** 
*@brief    
*@param  fd       int    
*@param  speed    int    
*@return  void 
*/  
int speed_arr[] = {B4000000, B3500000, B3000000, B2500000, B2000000, B1500000, B921600, B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300};  
int name_arr[] =  {4000000,  3500000,  3000000,  2500000,  2000000,  1500000,  921600,  115200,  38400,  19200,  9600,  4800,  2400,  1200,  300}; 

void set_speed(int fd, int speed){  
  int   i;   
  int   status;   
  struct termios   Opt;  
  tcgetattr(fd, &Opt);   											// 
  for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {   
    if  (speed == name_arr[i]) {       
      tcflush(fd, TCIOFLUSH);       								// / 
      cfsetispeed(&Opt, speed_arr[i]);    							// 
      cfsetospeed(&Opt, speed_arr[i]);     							// 
      status = tcsetattr(fd, TCSANOW, &Opt);    					// ,TCSANOW: 
      if  (status != 0) {          
        perror("tcsetattr fd1");    
        return;       
      }      
      tcflush(fd,TCIOFLUSH);
	  printf("set baud success
"); } } } int main(int argc, char *argv[]) { int fd,res; char buf[256] = {0}; char Ubuf[10]={0x55, 0x55}; char send_buf[256] = {0}; char device[256] = {0}; int len; int baud_rate = 0; int opt = 0; int receive_flag = 0; int i; while (opt != -1) { /* Handle input parameters */ opt = getopt(argc, argv, "b:rs:f:hp"); switch(opt) { case 'b': if (optarg) { baud_rate = atoi(optarg); printf("Trace: baud=%d
", baud_rate); } else { printf("please enter baud rate
"); return -1; } break; case 'r': receive_flag = 1; break; case 's': receive_flag = 0; if (optarg) { strcpy(send_buf ,optarg); } else { strcpy(send_buf ,Ubuf); } printf("send_buf=%s
", send_buf); break; case 'f': if (optarg) { strcpy(device ,optarg); printf("Trace: device=%s
", device); } else { printf("please enter tty device
"); return -1; } break; case 'h': goto help; break; case 'p': printf("Support baud rate:
"); for(i=0; i < sizeof(name_arr)/sizeof(name_arr[0]); i++) printf("%d
", name_arr[i]); return 0; default: break; } } printf("Start...
"); fd = open(device, O_RDWR | O_NOCTTY); if (fd < 0) { perror(device); exit(1); } printf("Open...
"); set_speed(fd, baud_rate); if(0 == receive_flag) { printf("Sending...
"); len = write(fd, send_buf, strlen(send_buf)); if(len > 0) printf(" %d send data successful
",len); else printf("send data failed!
"); } else { printf("Reading...
"); while(1) { res = read(fd, buf, 255); if(res==0) continue; buf[res]=0; printf("%s", buf); if (buf[0] == 0x0d) printf("
"); if (buf[0] == '@') break; } } printf("Close...
"); close(fd); return 0; help: printf("Usage:
\ send: %s -b baud_rate(115200) -f /dev/ttyHS* -s send_data
\ reveice: %s -b baud_rate(115200) -f /dev/ttyHS* -r
\ quiry baud rate: %s -p
",argv[0], argv[0], argv[0]); return 0; }