以下给出了一个源文件uart.c和makefile文件,在 sdk/mpp/sample/ 底下新建一个文件夹,随便命名,现在命名为UartTest,再把uart.c和makefile拷贝进去,编译
此外,还需要把 libjpeg.so libmpi.so libtde.so 放入核心板 /lib目录下;
所有的文件拷贝完成后 运行 ./uart /dev/ttyAMA2 0
源文件 uart.c
[csharp] view plain copy /* * 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[i]){ tcflush(fd, TCIOFLUSH); /* 清除输入输出缓冲区 */ if(0 != cfsetispeed(&scmTermios,speed_arr[i])){ /* 设置输入波特率 成功返回0 否则-1 */ printf("ERROR:Set input Serial baudrate fail\n"); } if(0 != cfsetospeed(&scmTermios,speed_arr[i])){ /* 设置输出波特率 成功返回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 */ } /* ********************************************************************************************************** *说 明:主函数 *入口参数: *出口参数: *备 注:LED灯闪烁 ********************************************************************************************************** */ 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); }Makefile 文件(其实就是在SDK/mpp/sample/ 底下随便找个例程把其中的makefile直接拿来用就行)
[csharp] view plain copy # Hisilicon Hi3516 sample Makefile include ../Makefile.param #ifeq ($(SAMPLE_PARAM_FILE), ) # SAMPLE_PARAM_FILE:=../Makefile.param # include $(SAMPLE_PARAM_FILE) #endif # target source SRC := $(wildcard *.c) OBJ := $(SRC:%.c=%.o) TARGET := $(OBJ:%.o=%) .PHONY : clean all all: $(TARGET) MPI_LIBS := $(REL_LIB)/libmpi.a MPI_LIBS += $(REL_LIB)/libhdmi.a $(TARGET):%:%.o $(COMM_OBJ) $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(JPEGD_LIBA) clean: @rm -f $(TARGET) @rm -f $(OBJ) @rm -f $(COMM_OBJ) cleanstream: @rm -f *.h264 @rm -f *.jpg @rm -f *.mjp @rm -f *.mp4