cool_fire

cool_fire

0个粉丝

9

问答

0

专栏

5

资料

cool_fire  发布于  2013-05-18 22:26:32
采纳率 0%
9个问答
5352

Hi3515 UART2和UART3驱动加载

 

这里主要想讲下海思Hi3515的UART2和UART3是如何被加载到内核中的,因为正在做一个项目需要使用四个串口,但海思提供的linux源码中只加载了两个串口的驱动,找了一圈,发现源码中没有现成的UART2和UART3的代码可以使用,只能自己动手改啦啊。。。

首先关于linux硬件模块的加载可以参考下面这篇博文:

http://hi.baidu.com/jackyu/blog/item/a89ba634e31418bcd1a2d3e5.html

好吧,我们进入正题,说说我做的过程:

Hi3515的UART驱动位于drivers/serial/amba-pl011.c

我们沿着pl011_init——amba_driver_register——driver_register——bus_add_driver——driver_attach——bus_for_each_dev往下走,找到bus_for_each_dev函数:

int bus_for_each_dev(struct bus_type bus, struct device start, void data, int (fn)(struct device , void )) { struct klist_iter i; struct device * dev; int error = 0;

if (!bus) return -EINVAL;

klist_iter_init_node(&bus->klist_devices, &i, (start ? &start->knode_bus : NULL)); while ((dev = next_device(&i)) && !error) error = fn(dev, data); klist_iter_exit(&i); return error; }

注意其中的

while ((dev = next_device(&i)) && !error) error = fn(dev, data); 就是这两条语句依次加载了四个串口驱动,这里的fn是外层的__driver_attach函数。。。

既然找到了加载的地方,那就printk吧,发现这个循环只进行了两次,也就是说只加载了串口0和串口1,说明链表里面只有两个串口的信息,那到底在什么地方把另外两个串口的信息添加进链表呢,google一番,终于找到啦,在arch/arm/mach-hi3515v100/core.c中我们将另外两个串口的信息加进去,编译,烧写,启动,发现/dev目录下已经有了ttyAMA2和ttyAMA3,兴奋了一下,上应用程序,上示波器,悲剧鸟,仍然没有数据出来,蛋疼啊。。。

于是继续往下找,找到pl011_tx_chars函数,直接在这里printk,看看我们用串口2和串口3发数据的时候写的到底是哪个寄存器,结果还真是串口2和串口3的数据寄存器,看到这个我有预感离胜利不远了啊,但为啥既然写的地址是对的,就是写不进去呢。。。回头翻Hi3515的手册,奶奶的,串口2和串口3收发数据的四个引脚是复用的,必须得配置复用控制寄存器,好,搞定这个继续编译,烧写,运行,上应用程序,上示波器,数据果然出来啦,happy。。。

顺便提醒一下,写复用控制寄存器的时候要用重映射之后的地址哦,不然会出错滴。。。

我来回答
回答8个
时间排序
认可量排序

ebaina_

0个粉丝

82

问答

40

专栏

0

资料

ebaina_ 2013-05-20 17:46:48
认可0
好贴,希望多多分享。:):)

aipupu

0个粉丝

1

问答

0

专栏

0

资料

aipupu 2013-07-06 14:35:26
认可0
最近在调试 驱动学习了。。

z31com

0个粉丝

2

问答

0

专栏

0

资料

z31com 2013-09-03 15:12:02
认可0
学习了,谢谢

Gsee360

0个粉丝

1

问答

0

专栏

0

资料

Gsee360 2014-04-01 14:53:36
认可0
最近在调试 驱动学习了。。

小米拍客光

0个粉丝

1

问答

0

专栏

0

资料

小米拍客光 2016-08-04 15:54:54
认可0
顶一顶    UART2的复用控制寄存器 怎么搞   大家帮帮忙啊

luohuawuhen

0个粉丝

9

问答

0

专栏

0

资料

luohuawuhen 2016-08-25 15:13:22
认可0
好贴,楼主的串口收发都正常吗,我的串口只能发不能收

13915426184

0个粉丝

15

问答

0

专栏

0

资料

13915426184 2017-09-12 09:25:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=36649&ptid=1724]luohuawuhen 发表于 2016-8-25 15:13[/url]
好贴,楼主的串口收发都正常吗,我的串口只能发不能收[/quote]

你好,请问你能发不能收的问题解决了么?我也遇到同样的问题了,原始中断寄存器没有接收中断产生但是数据寄存器已经有数据了

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2017-09-12 10:06:38
认可0
:lol:lol:lol:lol:lol:lol:lol:lol
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区