该用户从未签到
二级逆天
原厂PM 张工137 2421 2401
- 积分
- 164
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
海思Hi3520DV200 Hi3520DV300 Hi3520DV400 Hi3520DV500串口
/*
* uart_gkwzt.c
*
* Created on: 2012-10-15
* Author: root
*/
#include <stdio.h> /* 标准输入输出定义 */
#include <stdlib.h> /* 标准函数库定义 <span style="white-space:pre"> </span>*/
#include <unistd.h> /* Unix标准函数定义 <span style="white-space:pre"> </span>*/
#include <sys/types.h> /* */
#include <sys/stat.h> /* */
#include <fcntl.h> /* 文件控制定义 <span style="white-space:pre"> </span>*/
#include <termios.h> /* PPSIX终端控制定义 <span style="white-space:pre"> </span>*/
#include <errno.h> /* 错误号定义 */
#include <string.h>
#include "mpi_sys.h"
#include "hi_comm_sys.h"
#include "hi_io.h"
#include "hi_tde_api.h"
#define TRUE 1
#define FALSE 0
/*
**********************************************************************************************************
*寄存器基地址映射
**********************************************************************************************************
*/
#define IOCFG_BASE_ADDR 0x200F0000 /* IO口复用寄存器地址空间映射 */
#define GPIO0_BASE_ADDR 0x20150000 /* GPIO0的地址空间映射 */
#define GPIO1_BASE_ADDR 0x20160000 /* GPIO1的地址空间映射 */
#define GPIO2_BASE_ADDR 0x20170000 /* GPIO2的地址空间映射 */
#define GPIO3_BASE_ADDR 0x20180000 /* GPIO3的地址空间映射 */
#define GPIO4_BASE_ADDR 0x20190000 /* GPIO4的地址空间映射 */
#define GPIO5_BASE_ADDR 0x201A0000 /* GPIO5的地址空间映射 */
#define GPIO6_BASE_ADDR 0x201B0000 /* GPIO6的地址空间映射 */
#define GPIO7_BASE_ADDR 0x201C0000 /* GPIO7的地址空间映射 */
#define GPIO8_BASE_ADDR 0x201D0000 /* GPIO7的地址空间映射 */
int speed_arr[] = {B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300};
/*
**********************************************************************************************************
*说 明:设置波特率,数据位,停止位,奇偶校验位
*入口参数:
*出口参数:
**********************************************************************************************************
*/
int wzt_SetSerialParameter(int fd, int baudrate, int databits, int stopbits, int parity)
{
struct termios scmTermios ;
if(tcgetattr(fd,&scmTermios) != 0){
perror("Get serial parameter error");
return(FALSE);
}
/* 设置波特率 */
int i = 0;
for(i = 0; i < sizeof(speed_arr)/sizeof(int); i++){
if(baudrate == name_arr){
tcflush(fd, TCIOFLUSH); /* 清除输入输出缓冲区 */
if(0 != cfsetispeed(&scmTermios,speed_arr)){ /* 设置输入波特率 成功返回0 否则-1 */
printf("ERROR:Set input Serial baudrate fail\n");
}
if(0 != cfsetospeed(&scmTermios,speed_arr)){ /* 设置输出波特率 成功返回0 否则-1 */
printf("ERROR:Set output Serial baudrate fail\n");
}
break;
}
}
/* 设置数据位 */
scmTermios.c_cflag &= ~CSIZE; /* 清零 */
switch (databits){
case 7: scmTermios.c_cflag |= CS7; break;
case 8: scmTermios.c_cflag |= CS8; break;
default:fprintf(stderr,"Unsupported data size\n");return (FALSE);
}
/* 设置停止位 */
switch(stopbits){
case 1: scmTermios.c_cflag &= ~CSTOPB; break;
case 2: scmTermios.c_cflag |= CSTOPB; break;
default:fprintf(stderr,"Unsupported stop bits\n");return (FALSE);
}
/* 奇偶校验位 */
switch (parity){
case 'n':
case 'N':
scmTermios.c_cflag &= ~PARENB;
scmTermios.c_iflag &= ~INPCK;
break;
case 'o':
case 'O':
scmTermios.c_cflag |= (PARODD | PARENB);
scmTermios.c_iflag |= INPCK;
break;
case 'e':
case 'E':
scmTermios.c_cflag |= PARENB;
scmTermios.c_cflag &= ~PARODD;
scmTermios.c_iflag |= INPCK;
break;
case 'S':
case 's':
scmTermios.c_cflag &= ~PARENB;
scmTermios.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
if(parity != 'n') scmTermios.c_iflag |= INPCK;
scmTermios.c_cc[VTIME] = 150; /* 非规范模式读取时的超时时间 */
scmTermios.c_cc[VMIN] = 0; /* 非规范模式读取时的最小字符数 */
tcflush(fd, TCIOFLUSH); <span style="white-space:pre"> </span>/* 清除输入输出缓冲区 */
if (tcsetattr(fd,TCSANOW,&scmTermios) != 0){ <span style="white-space:pre"> </span>/* 不等数据传输完毕就立即改变属性 <span style="white-space:pre"> </span>*/
perror("Set serial parameter error");
return (FALSE);
}
else{
printf("MSG :Set serial parameter successfully!\n");
}
return (TRUE);
}
/*
**********************************************************************************************************
*说 明:标准输入模式,显示输入字符
*入口参数:
*出口参数:
**********************************************************************************************************
*/
void wzt_DisableTerminalReturn(int fd)
{
struct termios scmTermios;
tcgetattr(fd, &scmTermios);
scmTermios.c_lflag &= ~(ICANON | ECHO);
tcsetattr(fd, TCSANOW, &scmTermios);
}
/*
**********************************************************************************************************
*说 明:gpio 复用寄存器初始化,如果在内核中复用过,在这个地方就不需要配置
*入口参数:
*出口参数:
**********************************************************************************************************
*/
void gpio_cfg_init(void)
{
HI_S32 byregval = 0;
HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x050,0x01); /* 设置GPIO5_1为UART1_RXD */
HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x058,0x01); /* 设置GPIO5_3为UART1_TXD */
HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x05C,0x01); /* 设置GPIO5_4为UART2_RXD */
HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x060,0x01); /* 设置GPIO5_5为UART2_TXD */
HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x0B8,0x01); /* 设置GPIO1_0为UART3_TXD */
HI_MPI_SYS_SetReg(IOCFG_BASE_ADDR+0x0BC,0x01); /* 设置GPIO1_1为UART3_RXD */
}
/*
**********************************************************************************************************
*说 明:主函数
*入口参数:
*出口参数:
*备 注ED灯闪烁
**********************************************************************************************************
*/
int main(int argc, char** argv, char *envp[])
{
if(argc<3){
printf("*****************************************************\n");
printf("if argv[2] = 0,function: uart test \n");
printf("Usage: filename /dev/ttyAMAn 0\n");
printf("*****************************************************\n");
exit(0);
}
int action = atoi(argv[2]);
if(action==0){
gpio_cfg_init();
printf("Devices:%s\n",argv[1]);
int Ctrlfd = open(argv[1], O_RDWR);
if(-1 == Ctrlfd){
Ctrlfd = 0;
printf("Can't Open Serial Port!\n");
return 0;
}
wzt_SetSerialParameter(Ctrlfd, 115200, 8, 1, 'N');
wzt_DisableTerminalReturn(Ctrlfd);
int n=0,ret;
char buffer[1024];
char cmd[12];
for(n=0;n<10;n++){cmd[n]='0'+n;}cmd[10] = '\r';cmd[11] = '\n';
while(1){
cmd[0]='0'+(n++)%8;
ret = write(Ctrlfd,cmd,12);
int count = read(Ctrlfd,buffer,sizeof(buffer));
if(count>0){
buffer[count] = '\0';
printf("Read:%s\n",buffer);
}
else{
printf("Read:%d\n",count);
}
usleep(20000);
}
return 0;
}
exit(0);
} |
|