• 芯片制造中的阻挡层沉积技术介绍
  • 接地搭接电缆布局屏蔽!!!
  • 北美液冷生态解码:超微spuermicro,24年营
  • SK海力士全球首发HBM4-16层堆叠、2.0TB/s
  • 2纳米Nanosheet技术及其以后的选择性层减薄

海思Hi3520DV200  Hi3520DV300 Hi3520DV400 Hi3520DV500

[复制链接]
查看1110 | 回复11 | 2020-9-21 23:35:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
海思Hi3520DV200  Hi3520DV300 Hi3520DV400 Hi3520DV500串口
源文件 uart.c开发分享


/*
* 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);
}
原厂PM 张工137 2421 2401
回复

使用道具 举报

907321 | 2020-9-22 07:44:58 | 显示全部楼层
回复

使用道具 举报

wangy2000 | 2020-9-22 08:08:49 | 显示全部楼层
回复

使用道具 举报

wangyitu | 2020-9-22 08:37:32 | 显示全部楼层
回复

使用道具 举报

清心如水 | 2020-9-22 08:38:23 | 显示全部楼层
回复

使用道具 举报

zeosv | 2020-9-22 08:40:50 | 显示全部楼层
回复

使用道具 举报

sekisan | 2020-9-22 08:45:01 | 显示全部楼层
回复

使用道具 举报

luchonghui74 | 2020-9-22 08:46:10 | 显示全部楼层
回复

使用道具 举报

独嘉 | 2020-9-22 08:55:33 | 显示全部楼层
回复

使用道具 举报

cybi1861 | 2020-9-22 08:56:20 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则