【转】Hi3515 UART2和UART3驱动加载

本文详细介绍了如何为海思Hi3515的UART2和UART3添加驱动支持的过程。从源码分析入手,通过修改核心文件,解决了四个串口驱动加载的问题,并探讨了串口复用控制寄存器的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


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

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。。。

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





2011.03.31
看文档,找到控制串口复用的那几个寄存器,然后按照文档的要求设置下就是了啊,3515是reg0,reg1,reg10,reg11
writew(1, Seuic_REG0);
writew(1, Seuic_REG1);
writew(1, Seuic_REG10);
writew(1, Seuic_REG11);
至于这里映射后的地址如果你实在不知道怎么弄的话就把UART0和UART1的地址打出来,基址肯定一样的,改下偏移地址就是了

在arch/arm/mach-hi3515v100/core.c中所有出现uart0和uart1的地方都添上uart2和uart3就OK了。。。
转自:http://blog.youkuaiyun.com/wolfliuming/article/details/6294397
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值