DM3730 x-loader 分析 六 UART
来源:互联网 发布:淘宝卖家怎么看收藏 编辑:程序博客网 时间:2024/05/22 13:37
一. UART初始化
1.先配置MUX_DEFAULT,使需要使用UART管脚有效
2.配置相应寄存器,针对x-loader/Drivers/Ns16550.c文件,总结一个便于分析表格
关于波特率的产生,先看sprugn4r.pdf截图
可见波特率的产生需要,48MHz,DLH和DLL中的值也就是26,Divisor也就是表格中提到的16,以115200为例,26=4800000/(115200*16)
至于26的来源,可以参见sprugn4r中2913页
3.UART 接收和发送主要操作THR_REG串口数据发送寄存器,RHR_REG串口数据接收寄存器。
二 . 源码分析
x-loader/asm/arch-omap3/omap3430.h 69-72行宏定义了3个串口配置寄存器的基地址
x-loader/Include/configs/Omap3stalker.h中88-105行,用条件编译CFG_PRINTF,定义串口配置相关的宏。可以看到 配置的是uart1作为串口。因此如果要配置UART3作为串口打印信息,就是要修改88-105行。
x-loader/include/Ns16550.h 中定义在Ns16550.c中用到宏定义。主要是针对串口寄存器
x-loader/Drivers/Ns16550.c主要分析这个文件,如何对寄存器,对哪些寄存器进行配置。
x-loader/Drivers/Serial.c主要是串口波特率生成函数,发送函数以及接收函数,以及配置寄存器基地址选择。
x-loader/Include/configs/Omap3stalker.h中88-105行,用条件编译CFG_PRINTF,定义串口配置相关的宏。可以看到 配置的是uart1作为串口。因此如果要配置UART3作为串口打印信息,就是要修改88-105行。
x-loader/include/Ns16550.h 中定义在Ns16550.c中用到宏定义。主要是针对串口寄存器
x-loader/Drivers/Ns16550.c主要分析这个文件,如何对寄存器,对哪些寄存器进行配置。
x-loader/Drivers/Serial.c主要是串口波特率生成函数,发送函数以及接收函数,以及配置寄存器基地址选择。
x-loader/Drivers/Ns16550.c
void NS16550_init (NS16550_t com_port, int baud_divisor)
参数说明
NS16550_t com_port 串口配置寄存器基地址
int baud_diviso 波特率除数26
这个函数的意思是给串口配置寄存器赋值
{
com_port->ier = 0x00;
//com_port指向ier,IER_REG赋值0x00,不使能中断//
#ifdef CONFIG_OMAP
com_port->mdr1 = 0x7; /* mode select reset TL16C750*/
// ifdef 条件编译,之前如果定义了CONFIG_OMAP,就编译下面内容。
参数说明
NS16550_t com_port 串口配置寄存器基地址
int baud_diviso 波特率除数26
这个函数的意思是给串口配置寄存器赋值
{
com_port->ier = 0x00;
//com_port指向ier,IER_REG赋值0x00,不使能中断//
#ifdef CONFIG_OMAP
com_port->mdr1 = 0x7; /* mode select reset TL16C750*/
// ifdef 条件编译,之前如果定义了CONFIG_OMAP,就编译下面内容。
MDR1_REG赋值0x7,默认模式//
#endif
com_port->lcr = LCR_BKSE | LCRVAL;
// 0x80|0x03=1000 0011=LCR_REG,8bit数据位1位停止位,除数锁存模式//
com_port->dll = baud_divisor & 0xff;
// 通过分析baud_divisor=26,DLL_REG=0001 1010//
com_port->dlm = (baud_divisor >> 8) & 0xff;
//DLH_REG=0//
com_port->lcr = LCRVAL;
//LCR_REG=0000 0011,8bit数据位1停止位//
com_port->mcr = MCRVAL;
//MCR_REG=0000 0011,使能RTS,DTS//
com_port->fcr = FCRVAL;
//FCR_REG=0000 0111,使能FIFO,并且清空发送/接收FIFO//
#if defined(CONFIG_OMAP)
com_port->mdr1 = 0;/* select uart mode */
// DR1_REG=0,设置串口模式,UART 16X mode//
#endif
}
void NS16550_reinit (NS16550_t com_port, int baud_divisor)
//再次赋值初始化,目前还不太理解//
{
com_port->ier = 0x00;
com_port->lcr = LCR_BKSE;
com_port->dll = baud_divisor & 0xff;
com_port->dlm = (baud_divisor >> 8) & 0xff;
com_port->lcr = LCRVAL;
com_port->mcr = MCRVAL;
com_port->fcr = FCRVAL;
}
void NS16550_putc (NS16550_t com_port, char c)
参数说明
NS16550_t com_port 串口配置寄存器基地址
char c
发送函数判断LSR_REG【5】是否为0,如果是0,说明TX FIFO不为空,等待。
如果是1,说明TX FIFO已经发送完毕。
{
while ((com_port->lsr & LSR_THRE) == 0);
com_port->thr = c;
//THR_REG串口数据发送寄存器,填入字符c*/
}
char NS16550_getc (NS16550_t com_port)
参数说明
NS16550_t com_port 串口配置寄存器基地址
接收函数判断LSR_REG【0】,RX FIFO是否有数据接收。如果是0,没有数据接收,则等待。
如果是1,说明接收到1位数据,指针指向RHR_REG 接收数据寄存器。
{
while ((com_port->lsr & LSR_DR) == 0);
return (com_port->rbr);
}
int NS16550_tstc (NS16550_t com_port)
参数说明
NS16550_t com_port 串口配置寄存器基地址
这个函数判断LSR_REG【0】,如果是1,继续接收数据。
{
return ((com_port->lsr & LSR_DR) != 0);
}
#endif
#endif
#endif
com_port->lcr = LCR_BKSE | LCRVAL;
// 0x80|0x03=1000 0011=LCR_REG,8bit数据位1位停止位,除数锁存模式//
com_port->dll = baud_divisor & 0xff;
// 通过分析baud_divisor=26,DLL_REG=0001 1010//
com_port->dlm = (baud_divisor >> 8) & 0xff;
//DLH_REG=0//
com_port->lcr = LCRVAL;
//LCR_REG=0000 0011,8bit数据位1停止位//
com_port->mcr = MCRVAL;
//MCR_REG=0000 0011,使能RTS,DTS//
com_port->fcr = FCRVAL;
//FCR_REG=0000 0111,使能FIFO,并且清空发送/接收FIFO//
#if defined(CONFIG_OMAP)
com_port->mdr1 = 0;/* select uart mode */
// DR1_REG=0,设置串口模式,UART 16X mode//
#endif
}
void NS16550_reinit (NS16550_t com_port, int baud_divisor)
//再次赋值初始化,目前还不太理解//
{
com_port->ier = 0x00;
com_port->lcr = LCR_BKSE;
com_port->dll = baud_divisor & 0xff;
com_port->dlm = (baud_divisor >> 8) & 0xff;
com_port->lcr = LCRVAL;
com_port->mcr = MCRVAL;
com_port->fcr = FCRVAL;
}
void NS16550_putc (NS16550_t com_port, char c)
参数说明
NS16550_t com_port 串口配置寄存器基地址
char c
发送函数判断LSR_REG【5】是否为0,如果是0,说明TX FIFO不为空,等待。
如果是1,说明TX FIFO已经发送完毕。
{
while ((com_port->lsr & LSR_THRE) == 0);
com_port->thr = c;
//THR_REG串口数据发送寄存器,填入字符c*/
}
char NS16550_getc (NS16550_t com_port)
参数说明
NS16550_t com_port 串口配置寄存器基地址
接收函数判断LSR_REG【0】,RX FIFO是否有数据接收。如果是0,没有数据接收,则等待。
如果是1,说明接收到1位数据,指针指向RHR_REG 接收数据寄存器。
{
while ((com_port->lsr & LSR_DR) == 0);
return (com_port->rbr);
}
int NS16550_tstc (NS16550_t com_port)
参数说明
NS16550_t com_port 串口配置寄存器基地址
这个函数判断LSR_REG【0】,如果是1,继续接收数据。
{
return ((com_port->lsr & LSR_DR) != 0);
}
#endif
#endif
三. 做个简单的实验,使开发板UART3打印出信息
修改x-loader/Include/configs/Omap3stalker.h
0 0
- DM3730 x-loader 分析 六 UART
- DM3730 x-loader 分析 一
- DM3730 x-loader 分析 二
- DM3730 x-loader 分析 三
- DM3730 x-loader 分析 四
- DM3730 x-loader 分析 五
- DM3730 x-loader 分析 七 DDR
- x-loader启动过程分析
- 六 linux UART串口驱动代分析
- 1. x-loader执行流程分析
- x-loader
- TI DM3730 EBOOT分析(一)
- OMAP35x下OneNand的分析以及x-loader的介绍
- OMAP35x下OneNand的分析以及x-loader的介绍
- TI AM3517 EVM X-Loader启动流程分析
- UART设备驱动分析
- UART分析与设计
- UART软件设计与分析
- 几个小算法
- 两点关于jQuery的注意事项
- 营销型网站技术与营销的关系
- centOS安装XCache,用以缓存opcode
- 做了一个很奇怪的梦
- DM3730 x-loader 分析 六 UART
- C语言连接MySQL(codeblocks)
- openstack-计算节点安装(Node)
- centos7 安装iptables防火墙
- (7) 集合之Set类、List类、Map类、HashSet和HashMap的性能
- 最长子段和(动态规划)
- 51单片机解码红外遥控器原理
- svg径向渐变
- linux 命令系列之 运行级别(76)