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

16C554在LINUX上的移植(AT91)的更多相关文章

  1. Linux上USB移植错误解决笔记

    在内核目录下先配置支持USB设备,无论你是什么设备,这一步都是必须的,USB驱动和其他的驱动不同,它分为USB设备驱动,另外还有USB-Host主机控制器的驱动,配置如下: Device Driver ...

  2. Boa服务器在ARM+Linux上的移植

    下面给大家介绍一下Boa服务器移植的具体操作步骤,希望能够有帮助. 环境        主机:ubuntu8.10        交叉工具链:gcc-3.4.5-glibc-2.3.6         ...

  3. 网站移植到linux上后常犯的错误

    常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...

  4. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  5. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】

    [Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题4-共享库中嵌套库带路径[已解决] 标签:[Linux开发] 紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交 ...

  6. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题2---CMAKE配置问题

    实际上这里说的是移植的第一步,下载到源码后,我用的是opencv2.4.9,解压缩,然后可以利用cmake-gui来进行configure配置,这里面需要设置交叉编译的工具链,具体的可以参考[Linu ...

  7. 【Linux开发】OpenCV在ARM上的移植

    与X86 Linux类似,请参考:Linux 下编译安装OpenCV 本文在此基础上进行进一步操作. 网络上很多移植编译的方法比较老,多数针对OpenCV 1.0,而且方法很麻烦,不仔细操作很容易出错 ...

  8. Linux上的SQL Server的起步

    我们知道,几个星期前,微软发布了在Linux上直接运行的SQL Server第一个公开CTP版本!因此,对我来说,是时候跨界在Linux上安装我的第一个SQL安装,这样的话,我就可以在Linux上折腾 ...

  9. 嵌入式linux应用程序移植方法总结

    嵌入式linux应用程序移植方法总结 前段时间一直在做openCapwap的移植和调试工作,现在工作已接近尾声,编写本文档对前段工作进行一个总结,分享下openCapwap移植过程中的经验和感悟.江浩 ...

随机推荐

  1. python 3 爬取百度图片

    python 3 爬取百度图片 学习了:https://blog.csdn.net/X_JS612/article/details/78149627

  2. C经典之9-system,if,do,while---ShinePans

    #include <stdio.h> #include <conio.h> #include <stdlib.h> //system(); 这个指令须要用到此头文件 ...

  3. 删除android ScrollView边界阴影方法

    XML文件中添加以下方法:   android:fadingEdge=”none”   或者,代码中设置为false即可   ScrollView.setHorizontalFadingEdgeEna ...

  4. vb.net 鼠标控制

    Public Class Form1 Public Declare Sub mouse_event Lib "user32" Alias "mouse_event&quo ...

  5. KineticJS教程(8)

    KineticJS教程(8) 作者: ysm  8.动画 动画就是一帧帧的画面按照时间间隔显示出来,Kinetic给我们提供了一个舞台对象的onFrame方法,用这个方法可以绑定一个动画方法,我们要显 ...

  6. java程序设计题库

    选择题 答题要求:单选题,每题只有一个正确答案,选择正确给分,不正确不给分. 1. 下面(   A    )数据类型可用于main()方法中传递的参数 A.String   B.Integer   C ...

  7. EXT-JS 6演示样例程序-Login演示样例程序

    1.        用Sencha Cmd生成应用程序模版 sencha -sdk /path/to/ExtSDK generate app -classic TutorialApp./Tutoria ...

  8. 转载【微信支付】jsapi支付之传参问题(使用微信官方SDK之PHP版本) V3之WxpayPubHelper 亲测有效,V3WxpayAPI_php_v3.zip版未测试,理论上也是一样的。

    本文转载至:http://blog.csdn.net/geeklx/article/details/51146151 (微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请 ...

  9. Linux-iptables详解

    一:前言   防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...

  10. Linux-ssh证书登录(实例详解)

    前言 本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的各种问题, ...