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を生成し、テストを開始します.
テストが完了しました.
次はUARTのテストコードuart-testです.c
シナリオ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;
}