zoukankan      html  css  js  c++  java
  • 16C554在LINUX上的移植(AT91)

    16C554在LINUX上的移植(AT91)

    linux版本:3.14.17
    AT91SAMa5d36
     
    EINTA_0   ARM-IO5        PA14         14
    EINTA_1   ARM-IO7        PA2           2
    EINTA_2   ARM-IO9        PA8           8
    EINTA_3   ARM-IO11      PA3           3
     
    EINTB_0   ARM-IO6        PA4           4
    EINTB_1   ARM-IO8        PA0           0
    EINTB_2   ARM-IO10      PA1           1
    EINTB_3   ARM-IO12      PA9           9
     
    EINTC_0   ARM-MCIO_DA0      PD1           97
    EINTC_1   ARM-MCIO_DA2      PD3           99
    EINTC_2   ARM-MCIO_DA4      PD5           101
    EINTC_3   ARM-MCIO_DA6      PD7           103
     
    EINTD_0   ARM-MCIO_DA1      PD2           98
    EINTD_1   ARM-MCIO_DA3      PD4           100
    EINTD_2   ARM-MCIO_DA5      PD6           102
    EINTD_3   ARM-MCIO_DA7      PD8           104
     
     
     
     
    修改串口扩展驱动:
     
    1,在/drivers/serial/下以8250_exar_st16c554.c文件为模板创建8250_at91_xr16v554.c文件;修改相应的PORT和中断号,修改Platform device ID为
    PLAT8250_DEV_AT91_XR16V554;在init函数中加入了对总线,及中断口的初始化操作;;在文件/include/linux/serial_8250.h ID列表中加入该ID;
     
     
    /drivers/serial/Kconfig加入:
    config SERIAL_8250_AT91_XR16V554
    tristate "Support Exar XR16V554/554D Quad UART for AT91"
    depends on SERIAL_8250 != n
    help
     RP2805 uses xr16v554d to form Quad UART.  If you are
     using these UARTs,
     say Y here.
     
     To compile this driver as a module, choose M here: the module
     will be called 8250_at91_xr16v554.
     
    /drivers/serial/makefile加入:
    obj-$(CONFIG_SERIAL_8250_AT91_XR16V554) += 8250_at91_xr16v554.o
     
    2,8250.c无须修改!!
     
    需要注意的地方:
    1,
    #define PORT(_base,_irq)    
    {        
    .mapbase = _base,
    .irq = _irq,
    .irqtype = FALLING;
    .uartclk = 24000000,
    .iotype = UPIO_MEM32,
    .regshift = 2,            
    .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
    }
    宏中,.mapbase指的是16C554的物理基地址,注意不是membase;.uartclk是16C554晶振的频率,其最高波特率 为.uartclk/16;.iotype指的是访问类型,与硬件的连接相关,UPIO_MEM指的是8位总线连接,而UPIO_MEM32表示为32位 总线访问方式,即访问16C554的寄存器时,读取32位数,取低8位;.regshift也跟硬件的物理连接相关,指的是访问16C554的每个地址时 的偏移,也就是16C554的A0对应CPU的A几;UPF_IOREMAP指16C554寄存器需要映射到虚拟地址访问;
     
    2,
    .dev = {
    .platform_data = xxx_data,
    },
    设备结构声明中的xxx_data因为是个多维数组,从而.platform_data = xxx_data与.platform_data = &xxx_data意义是一样的,都可以;
     
    3,
    platform_device无须在板极初始化中注册,使用module_init声明即可;
    链接的次序,对应执行的次序,与makefile中的次序一致;而注册platform_device与注册platform_driver的次序无关, 注册成功时都会匹配,匹配成功,都会调用probe函数,probe设备,只有probe成功才会进行地址映射,分配资源等等的操作;
     
    4,
    通过阅读参考1及8250.c serial_core.c源代码,发现:
    在serial8250_init(void)函数中总会注册一ID为PLAT8250_DEV_LEGACY的platform_device,而该设备的资源在old_serial_port[]中定义,
    而该数组依赖于SERIAL_PORT_DFNS的定义,如果定义为空则,该device不会添加port;而其他device调用platform_device_register()函数时,如果匹配
    驱动,会调用serial8250_probe(),该函数会从该设备的资源中读出数据,检测每个port,如果存在则申请中断号,映射物理地址等等,并添加port。
    从而添加新的设备无须修改8250.c,初始化时默认添加的设备只要不定义SERIAL_PORT_DFNS,并不会有影响。
     
    5,如果使用了GPIO中断,则需要注意AT91的普通IO口不能设置为上升沿或下降沿触发,而只能定义为边沿触发,即每次有效电平触发2次,只是浪费了CPU,并不会
    影响使用;
     
    6,
    如果开机检测成功,添加端口成功,会打印:
    serial8250.11: ttyS0 at MMIO 0x30000000 (irq = 83) is a 16550A
    serial8250.11: ttyS1 at MMIO 0x30000008 (irq = 84) is a 16550A
    serial8250.11: ttyS2 at MMIO 0x30000010 (irq = 85) is a 16550A
    serial8250.11: ttyS3 at MMIO 0x30000018 (irq = 86) is a 16550A
     
    几个有用的命令:
    查看各个串口的资源,如果不正常肯定初始化有问题
    cat /proc/tty/driver/serial
    从串口读出数据(波特率是上次设定的)
    cat /dev/ttyS0 
    查看IOMEM
    cat /proc/iomem
     
     
    参考:
    1,《linux设备模型之uart驱动分析》
    http://blog.chinaunix.net/u1/51562/showart.php?id=1110903
    2,《我在Linux-2.6.32.2下为ST16C554移植驱动的经历》
    http://blog.chinaunix.net/u3/106983/showart_2148343.html
    3,《linux2.6.14内核下移植16C554驱动》
    http://blog.chinaunix.net/u3/92401/showart_2253514.html
  • 相关阅读:
    (转)asp.net页面出错时的处理方法
    Angular.js学习笔记 (二) H.U.C
    一套常用的css初始化样式 H.U.C
    hexo工具介绍及使用方法 H.U.C
    Angular.js学习笔记 (一) H.U.C
    Nhibernate 对view 查询的几种方法
    如何做类似google的Textbox的AutoComplete增强版,可以显示多列
    POS 打印机编程控制
    (转) 商品损耗控制
    win 2008 IIS 7 安装 PHPMYAdmin
  • 原文地址:https://www.cnblogs.com/zym0805/p/4815041.html
Copyright © 2011-2022 走看看