旧文-16C554在LINUX上的移植(AT91)-2010年06月24日 11:29

linux版本:2.6.30

AT91SAM9263

修改串口扩展驱动:

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

My PSMU-C4M11 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, \

.uartclk = 7372800, \

.iotype = UPIO_MEM, \

.regshift = 0,            \

.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,并不会

影响使用,如果想修改,则可在修改8250.c中的中断函数,无效中断直接返回即可,参考如下:

+#define AT91_GPIO_IRQ_HACK

+

+#ifdef AT91_GPIO_IRQ_HACK

+#include <mach/gpio.h>

+#endif

+#ifdef AT91_GPIO_IRQ_HACK

+#define NR_TRIES 10

+ int ntries = 0;

+ int pin_val1, pin_val2;

+ do {

+ pin_val1 = at91_get_gpio_value(AT91_PIN_PB20);

+ pin_val2 = at91_get_gpio_value(AT91_PIN_PB20);

+ } while (pin_val1 != pin_val2 && ntries++ < NR_TRIES);

+

+ udelay(20); // XXX: this need to be here otherwise IDE layer losts interrups, don‘t know why !!!

+ if (pin_val1 == 0 || ntries > NR_TRIES)

+ return IRQ_HANDLED;

+#undef NR_TIRES

+#endif

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

4,

/arch/arm/mach-at91/board-tms.c

该文件中有添加16C550驱动定义

时间: 2024-11-05 06:53:30

旧文-16C554在LINUX上的移植(AT91)-2010年06月24日 11:29的相关文章

16C554在LINUX上的移植(AT91)

16C554在LINUX上的移植(AT91) linux版本:2.6.30 AT91SAM9263 修改串口扩展驱动: 1,在/drivers/serial/下以8250_exar_st16c554.c文件为模板创建8250_at91_xr16v554.c文件:修改相应的PORT和中断号,修改Platform device ID为 PLAT8250_DEV_AT91_XR16V554:在init函数中加入了对总线,及中断口的初始化操作::在文件/include/linux/serial_8250

零基础学习云计算及大数据DBA集群架构师【Linux系统环境及权限管理2015年12月24日周四】

1 2015.12.24/Thu 2 3 *************摘要************** 4 ACL主机的细部权限规划 ACL getfacl setfacl 5 attr文件与目录的隐藏属性 attr lsattr chattr 6 文件系统 P196 ext2/3/4 xfs 7 目录树 8 软硬连结 ln 9 指令和文件的搜索 which whereis locate find /var/lib/mlocate/mlocate.db 10 11 ?如何查看软链接文件在磁盘上存放

Linux运维学习-3——2016年7月24日

格式说明: 操作 概念 命令 说明及举例 三-1 touch /etc/nologin 使普通用户不能登录(创建了一个文件,删掉就可以登陆)   ll /etc/nologin 查看那个文件 -rm -f /etc/  删除那个文件 init 0(关机) 3 5 6(重启) free 查看内存   reset 修复(出乱码的时候) strace ltrace touch `date +%F`.log 创建一个以日期命名的文件 touch f1 f2 f3 touch f{1,2,3,4,5}.{

Linux运维学习-4——2016年7月26日

格式说明: 操作 概念 命令 说明及举例 四 du -sh /sys 查看文件.文件夹大小 /sys/class/scsi_host/host2/scan 在线扫盘(新加硬盘执行这个命令后才能发现) stat /etc/issue 更详细的看数据 蓝色:目录绿色:可执行文件浅蓝色:链接文件红色:压缩文件 创建-h文件名的文件,删除?访问?绝对路径 -:常规文件d:目录l:链接文件b:块设备(比如硬盘,有缓存)c:字符设备(不真实存在,没缓存) p:管道文件 例: 命令1 | 命令2 命令1的输出

linux运维实战练习-2015年9月01日课程作业(练习)

linux运维实战练习-2015年9月01日课程作业(练习)安排 一.作业(练习)内容: 1.复习本次课程所讲的内容 2.总结整理磁盘管理及文件系统管理中设计的各种命令的使用,并附注一定的示例: 在Linux中,一块磁盘能被使用(可以被访问.被写入.被存储)要有以下三个步骤: (1)进行磁盘分区,及创建分区 (2)创建文件系统 (3)挂载文件系统 (1)磁盘分区 创建分区的命令: fdisk, parted, sfdisk fdisk:最多支持在一块硬盘上的15个分区:fdisk提供了一个交互式

linux运维实战练习-2015年9月5日课程作业(任务计划使用和练习)-JY1506402-19+liuhui880818

作业目标:linux运维实战练习-2015年9月5日课程作业(练习)安排 作业环境:CentOS 6.7/7 x86_64 一.作业(练习)内容: 1.总结Linux系统上的任务计划(at.crontab)的详细使用方法: 2.每周一到周六的凌晨3点20分,运行cp命令对/etc/目录进行归档另存,存储位置为/backups/etc-YYYY-MM-DD: 3.每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为/backup/fstab-YYYY-MM-DD-hh-

Linux运维学习-2——2016年7月21日

格式说明: 操作 概念 命令 说明及举例 二 internet 因特网ethernet 以太网ctrl+alt+F1 图形界面ctrl+alt+F2-F6 字符界面 命令:who am i/who/who me i/tty/df/ifconfig/w/ halt 关机 reboot 重启 chvt 1-6 切换终端 init 3 关闭图形界面 init 5 打开图形界面 cp 复制 pwd 显示当前目录 lsblk 列出硬盘信息 id -u mg 查看用户ID,root为9,其他为普通用户,不加

linux运维实战练习-高级班-2015年10月18日-10月24日课程作业(练习)安排

一.作业(练习)内容: 1.阐述Linux HA Cluster的使用背景: 2.总结Linux HA Cluster的系统组成,HA Cluster的工作模型: 3.通过LAMP组合,基于heartbeat v2 crm实现HA:要求,部署wordpress,用于编辑的文章中的任何数据在节点切换后都能正常访问: 二.完成时间: 2015年10月24日之前. 三.提交方式: 请将作业的博文链接地址以评论本博客的形式提交. 格式如: 学员编号+姓名   http://mageedu.blog.51

linux运维实战练习-中级班套餐班-2015年10月18日-10月24日课程作业(练习)安排

一.作业(练习)内容: 1.MariaDB基础总结,包括表管理.索引管理.用户及权限管理: 2.编译安装LAMP,其中分别实现: (1).把php编译成为httpd的模块 (2).php以fpm工作为独立守护进程 3.安装并配置基于虚拟用户的vsftpd: 4.建立nfs共享,将主机172.16.0.1上的目录/magedu通过nfs共享给172.16.0.0/16(可根据自己的网络情况来设置)网络的主机以读写方式使用: 5.建立samba共享,共享目录为/data,要求: 1)共享名为shar