1      Scope of Document

This document describes UART hardware design, uart driver porting

2      Requiremen

2.1     Function Requirement

Uboot enable uart0 for debug, Kernel enable uart0 uart1 uart2 uart3.

2.2     Performance Requirement

Support common uart rx tx function.

3      Hardware Overview

uart interface,pin map:

// uart 0

AM335X_UART0_RXD

AM335X_UART0_TXD

// uart 1

AM335X_UART1_RXD

AM335X_UART1_TXD

// uart 2

AM335X_UART2_RXD

AM335X_UART2_TXD

// uart 3

AM335X_UART3_RXD

AM335X_UART3_TXD

 

Figure 1 uart interface block diagram

4      Functional Description

4.1     UART DRIVER Overview

The UART Driver enables the UART’s available on the device. The driver configures the UART hardware and interfaces with a number of standard linux tools (ex. stty, minicom, etc.) to enable the configuration and usage of the hardware. The H/W UARTs available will vary by SoC and system configuration.

4.2     UART

4.2.1 Overview

The UART driver can be used to send/receive raw ASCII characters from the User Interface as shown by the below diagram..

4.2.1 User Layer

The UART driver leverages the TTY framework within Linux. This framework uses typical file I/O operations to interact with the UART. This interface allows userspace modules to easily be developed to read/write the /dev/ttyxx to exchange data over the UART. Since this is a very common Linux framework, there are many standard tools that can be used to interact with it. These tools, like stty, minicom, picocom, and many others, can easily be used to exercise a UART for data exchange.

Features

  • Exposes UART to User Space via /dev/tty*
  • Supports multiple baud rates and UART capabilities
  • Hardware Flow Control

5      Porting

5.1     Uboot porting

In uboot default enable debug uart, so do not need to modify.

5.2     Kernel porting

Index: am335x-evm.dts

uart1_pins: pinmux_uart1_pins {

pinctrl-single,pins = <

AM33XX_IOPAD(0x980, PIN_INPUT_PULLUP | MUX_MODE1)      /* uart1_rxd.uart1_rxd */

AM33XX_IOPAD(0x984, PIN_OUTPUT_PULLDOWN | MUX_MODE1)  /* uart1_txd.uart1_txd */

>;

};

uart2_pins: pinmux_uart2_pins {

pinctrl-single,pins = <

AM33XX_IOPAD(0x92c, PIN_INPUT_PULLUP | MUX_MODE1)      /* mii1_txclk.uart2_rxd */

AM33XX_IOPAD(0x930, PIN_OUTPUT_PULLDOWN | MUX_MODE1)  /* mii1_rxclk.uart2_txd */

>;

};

uart3_pins: pinmux_uart3_pins {

pinctrl-single,pins = <

AM33XX_IOPAD(0x934, PIN_INPUT_PULLUP | MUX_MODE1)      /* mii1_rxd3.uart3_rxd */

AM33XX_IOPAD(0x938, PIN_OUTPUT_PULLDOWN | MUX_MODE1)  /* mii1_rxd2.uart3_txd */

>;

};

&uart1 {

pinctrl-names = "default";

pinctrl-0 = <&uart1_pins>;

status = "okay";

};

&uart2 {

pinctrl-names = "default";

pinctrl-0 = <&uart2_pins>;

status = "okay";

};

&uart3 {

pinctrl-names = "default";

pinctrl-0 = <&uart3_pins>;

status = "okay";

};

6      Follow-up

Uart loop test code:

#include     <stdio.h>

#include     <stdlib.h>

#include     <string.h>

#include     <unistd.h>

#include     <sys/types.h>

#include     <sys/stat.h>

#include     <fcntl.h>

#include     <termios.h>

#include     <errno.h>

#include     <pthread.h>

#include     <sys/ioctl.h>

#define FALSE 1

#define TRUE 0

int fd=-1;

char buff[512];

int speed_arr[] = {  B115200, B57600, B38400, B19200, B9600, B4800,

B2400, B1200};

int name_arr[] = {115200, 57600, 38400,  19200,  9600,  4800,  2400, 1200};

#define debugnum(data,len,prefix)  \

{ \

unsigned int i;   \

for (i = 0;i < len;i++) { \

if(prefix)  \

printf("0x%02x ",data[i]); \

else  \

printf("%02x ",data[i]); \

} \

}

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);

if (status != 0)

perror("tcsetattr fd1");

return;

}

tcflush(fd,TCIOFLUSH);

}

}

int set_Parity(int fd,int databits,int stopbits,int parity)

{

struct termios options;

if  ( tcgetattr( fd,&options)  !=  0)

{

perror("SetupSerial 1");

return(FALSE);

}

options.c_cflag &= ~CSIZE;

switch (databits)

{

case 7:

options.c_cflag |= CS7;

break;

case 8:

options.c_cflag |= CS8;

break;

default:

fprintf(stderr,"Unsupported data size\n");

return (FALSE);

}

switch (parity)

{

case 'n':

case 'N':

options.c_cflag &= ~PARENB;

options.c_iflag &= ~INPCK;

break;

case 'o':

case 'O':

options.c_cflag |= (PARODD | PARENB);

options.c_iflag |= INPCK;

break;

case 'e':

case 'E':

options.c_cflag |= PARENB;

options.c_cflag &= ~PARODD;

options.c_iflag |= INPCK;

break;

case 'S':

case 's':

options.c_cflag &= ~PARENB;

options.c_cflag &= ~CSTOPB;

break;

default:

fprintf(stderr,"Unsupported parity\n");

return (FALSE);

}

switch (stopbits)

{

case 1:

options.c_cflag &= ~CSTOPB;

break;

case 2:

options.c_cflag |= CSTOPB;

break;

default:

fprintf(stderr,"Unsupported stop bits\n");

return (FALSE);

}

options.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);

options.c_oflag &= ~OPOST;

options.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);

/* Set input parity option */

if (parity != 'n')

options.c_iflag |= INPCK;

options.c_cc[VTIME] = 150; // 15 seconds

options.c_cc[VMIN] = 0;

tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */

if (tcsetattr(fd,TCSANOW,&options) != 0)

{

perror("SetupSerial 3");

return (FALSE);

}

return (TRUE);

}

void receivethread(void)

{

int nread;

while(1)

{

if((nread = read(fd,buff,100))>0) //接收数据

{

printf("[RECEIVE] Len is %d,content is :\n",nread);

buff[nread]='\0';

printf("%s\n",buff);

}

usleep(100/**1000*/);

}

return;

}

int main(int argc, char *argv[])

{

char str[500];

pthread_t receiveid;

int  c, ctrlbits;

/*

参数个数小于1则返回,按如下方式执行:

./uart_test /dev/ttyAT1

*/

if (argc < 2) {

printf("Useage: %s dev\n", argv[0]);

exit(0);

}

printf("test\n");

fd = open(argv[1], O_RDWR);

if (fd < 0){

printf("open device %s faild\n", argv[1]);

exit(0);

}

set_speed(fd,115200); //设置串口波特率

set_Parity(fd,8,1,'N'); //设置8位数据位,1位停止位,无校验等其他设置。

pthread_create(&receiveid,NULL,(void*)receivethread,NULL);//创建接收线程

while(1)

{

printf("Please Input string to send to %s\n:",argv[1]);

scanf("%s", str);

if(strlen(str)>0){

//发送数据

write(fd, str, strlen(str));

write(fd, "\n", strlen("\n"));

usleep(200*1000);

}

}

close(fd);

exit(0);

}

am335x system upgrade kernel uart(七)的更多相关文章

  1. am335x system upgrade kernel tf(五)

    1      Scope of Document This document describes TF hardware design 2      Requiremen 2.1     Functi ...

  2. am335x system upgrade kernel ethernet(四)

    1      Scope of Document This document describes ethernet hardware design and porting KZS8081 to ubo ...

  3. am335x system upgrade kernel gpio(九)

    1      Hardware Overview gpio interface,pin map: AM335X_I2C0_W_C----------------------MCASP0_AXR1 /* ...

  4. am335x system upgrade kernel can(八)

    1      Scope of Document This document describes can bus hardware design and can bus driver developm ...

  5. am335x system upgrade kernel i2c rtc eeprom(六)

    1      Scope of Document This document describes i2c bus hardware design and support i2c-devices: ee ...

  6. am335x system upgrade kernel ec20 simcom7600ce(十一)

    1      Scope of Document This document describes 4G hardware design, support quectel ec20 4G module/ ...

  7. am335x system upgrade kernel usb stroage(十)

    1      Scope of Document This document describes USB hardware design, support stardard usb2.0 port o ...

  8. am335x system upgrade kernel f-ram fm25l16b(十六)

    1      Scope of Document This document describes SPI F-RAM hardware design 2      Requiremen 2.1     ...

  9. am335x system upgrade kernel emmc(十八)

    1      Scope of Document This document describes EMMC hardware design 2      Requiremen 2.1     Func ...

随机推荐

  1. pyenv基本使用

    pyenv使用 1.安装: git clone https://github.com/pyenv/pyenv.git 2.配置pyenv环境变量 echo 'export PYENV_ROOT=&qu ...

  2. gdb调试常用功能

    一.gdb中宏定义 macro define list_entry(ptr, type, member) ((type)( (char)ptr - (unsigned long)(&((typ ...

  3. gorm 批量插入数据

    使用gorm 插入数据的时候,根据官方文档可以使用Create或者FirstOrCreate(). 但是官方没有提供批量插入数据的方法. 根据github的 issue得知,我们可以通过自己拼接sql ...

  4. Android自动化测试之Monkey 转自:LupuX

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011436666/article/details/53998332 在之前的文章Android自动 ...

  5. LOJ3119 CTS2019 随机立方体 概率、容斥、二项式反演

    传送门 为了方便我们设\(N\)是\(N,M,L\)中的最小值,某一个位置\((x,y,z)\)所控制的位置为集合\(\{(a,b,c) \mid a = x \text{或} b = y \text ...

  6. go 语言学习 ---解析xml

    实例1 //main package main import ( "bytes" "encoding/xml" "fmt" "io ...

  7. Online Hard Example Mining 理解

    Definition: Online Hard Example Mining (OHEM) is a way to pick hard examples with reduced computatio ...

  8. 每周分享五个 PyCharm 使用技巧(六)

    大家好,今天我又来给大家更新 PyCharm 的使用技巧. 从今年3月24号开始一直到今天,将近四个月的时间.包括本篇,一共更新了6篇文章,每篇 5 个小技巧,总计 30 个. 这30个使用技巧,全部 ...

  9. Git创建工作目录与常用指令

    1.创建工作目录与常用指令 工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文. 日常使用只要记住下图6个命令: 2.提交管理 ...

  10. MySQL数据库的事物隔离级别

    一. 查看数据库的事物隔离级别 mysql> show variables like '%isolation'; +-----------------------+--------------- ...