linux UART串口驱动开发文档
一页,最终调用的是create_mapping(), 建立页表映射是与具体的平台相关的,位于mach_ep93xx/mm/ proc-arm920.S文件中提供了与具体平台相关的页表建立函数,其中包括TLB表操作/Cache操作/页表操作等:
在上层的start_kernel→setup_arch→ setup_processor调用下,会在proc-arm920.S文件中查找.proc.info节的__arm920_proc_info,并从中找到配置的process相关的操作函数,具体的arm页表建立的详情须要参看ARM内存管理的相关手册.
.section .proc.info, #alloc, #execinstr
.type __arm920_proc_info,#object
__arm920_proc_info:
.long 0x41009200
……
.long arm920_processor_functions
.size __arm920_proc_info, . - __arm920_proc_info
在arm920_processor_functions中包含的页表操作如下:
/* pgtable */
.word CPU_arm920_set_pgd
.word cpu_arm920_set_pmd
.word cpu_arm920_set_pte
2. 与串口硬件相关的宏主.
如下, 下面将详术如下, 并指出其具体被使用的环境上下文:
1>. 读写数据.
#define UART_GET_CHAR(p) ((readb((p)->membase + W83697_UARTDR)) 0xff)
#define UART_PUT_CHAR(p, c) writeb((c), (p)->membase + W83697_UARTDR)
2>. 接收发送状态.
#define UART_GET_RSR(p) ((readb((p)->membase + W83697_UARTRSR)) 0xff)
#define UART_PUT_RSR(p, c) writeb((c), (p)->membase + W83697_UARTRSR)
3>. 发送及接收中断状态.
#define UART_GET_CR(p) ((readb((p)->membase + W83697_UARTCR)) 0xff)
#define UART_PUT_CR(p,c) writeb((c), (p)->membase + W83697_UARTCR)
#define UART_GET_INT_STATUS(p) ((readb((p)->membase + W83697_UARTIIR)) 0xff)
4>. 以及其它的中断使能设置等, 在传送时打开传送中断即会产生传送中断.
#define UART_PUT_ICR(p, c) writeb((c), (p)->membase + W83697_UARTICR)
5>. FIFO的状态, 是否读空/是否写满; 每次读时必须读至FIFO空, 写时必须等到FIFO不满时才能写(要等硬件传送完) .
接收中断读空FIFO的判断:
status = UART_GET_FR(port);
while (UART_RX_DATA(status) max_count--) {
……
}
发送中断写FIFO: 当发送缓冲区中有数据要传送时, 置发送中断使能, 随后即产生传送中断, 此时FIFO为空, 传送半个FIFO大小的字节, 如果发送缓冲区数据传完,则关闭发送中断.
6>. 传送时可直接写串口数据口, 而不使用中断, 但必须等待检测FIFO的状态
do {
status = UART_GET_FR(port);
} while (!UART_TX_READY(status)); //wait for tx buffer not full...
3. 串口驱动的参数配置
串口的参数主要包括如下几个参数,全部都记录在uart_port结构上,为静态的赋值,本串口驱动支持6个设备,所以驱动中就包括了6个port,一个串口对应一个port口,他们之间除了对应的中断号/寄存器起始基址/次设备号不同之外,其它的参数基本相同.
√串口对应中断, 这里六个串口,其中有3个串口使用的系统外部中断0/1/2, 其中另外几个中断用提GPIO中断,具体有关GPIO中断的内容可参见EP93XX芯片手册, GPIO中断共享一个系统中断向量,涉及中断共享的问题,后面将详述LINUX中的中断共享支持.
√串口时钟, 串口时钟用来转换计算须要设置到配置寄存器当中的波特率比值,其计算方法为:quot = (port->uartclk / (16 * baud)); baud为当前设置的波特率,可为115200等值, 取决于所选的串口时钟源, quot即为要设置到寄存器当中的比值.
√串口基址, 即串口所有配置寄存器基础址.
√串口次设备号(由驱动中的最低次设备号依次累加)
前面已经讲过了六个串口中断,这里详细列出对应情况如下,方便查找:
w83697的三个串口对应中断如下:
uart 1: 读写数据寄存器偏移为00x3F8, 对应系统外部中断INT_EXT[0].
uart 2: 读写数据寄存器偏移为00x2F8, 对应系统外部中断INT_EXT[1].
uart 3: 读写数据寄存器偏移为00x3e8, 对应系统外部中断INT_EXT[2].
uart 4: 读写数据寄存器偏移为00x3e8, 对应EGPIO[8].
w83977的两个串口对应中断如下:
uart 1: 读写数据寄存器偏移为00x3F8, 对应EGPIO[1].
uart 2: 读写数据寄存器偏移为00x2F8, 对应EGPIO[2].
下面列出其中一个具体的串口port的定义如下:
{
.port = {
.membase = (void *)W83697_UART4_BASE,
.mapbase = W83697_UART4_BASE,
.iotype = SERIAL_IO_MEM,
.irq = W83697_IRQ_UART4, //串口中断号
.uartclk = 1846100, //uart时钟,默认.
.fifosize = 8, //硬件fifo大小.
.ops = amba_pops, //底
- 嵌入式软件设计中查找缺陷的几个技巧(03-06)
- 基于算法的DSP硬件结构分析(04-02)
- Windows CE下驱动程序开发基础(04-10)
- DSP+FPGA在高速高精运动控制器中的应用(05-17)
- 基于USB接口和DSP的飞机防滑刹车测试系统设计(05-19)
- 一种基于DSP平台的快速H.264编码算法的设计(05-19)