基础介绍
ARM官网的介绍:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0224b/index.html
高级微控制器总线结构Advanced Microcontroller Bus Architecture(AMBA)定义了高性能嵌入式微控制器的通信标准。可以将RISC处理器集成在其他IP芯核和外设中,它是有效连接IP核的“数字胶”,并且是ARM复用策略的重要组件。它不是芯片与外设之间的接口,而是ARM内核与芯片上其他元件进行通信的接口。AMBA 协议是用于连接和管理片上系统 (SoC) 中功能块的开放标准和芯片上互连规范。使用它,可以帮助开发带有大量控制器和外设的多处理器设计。AMBA 通过使用 ACE、AXI、AHB、APB 和 ATB 的规范对 SoC 模块的共同主干进行定义,这有助于设计的重复使用。
内核中专门定义了一类amba_bustype、amba_device、amba_driver。具体定义在内核的/drivers/amba/bus.c中。
按理说AMBA是一种片内总线,对驱动程序员来说是透明的,为什么还要定义一类amba_device/amba_driver呢?
看看内核源码中的解释:
* linux/include/amba/bus.h
*
* This device type deals with ARM PrimeCells and anything else that
* presents a proper CID (0xB105F00D) at the end of the I/O register
* region or that is derived from a PrimeCell.
也就是说amba_device定义的是ARM的PrimeCells提供的片内外设,当然这些外设都使用AMBA总线。这些外设有一个特征,那就是在自己的IO地址空间的尾部存放了一个固定的CID(0xB105F00D),表明这是一个amba_device。由于ARM众多的合作伙伴都会或多或少的使用ARM提供的片内外设,所以众多厂商的ARM处理器的一些外设可以使用相同的驱动,只有IO地址空间和中断号的区别,寄存器和操作方式都是类似的。为了管理这类驱动,内核中专门建立了amba子系统。CID正是为了向驱动表明这是一个amba_device。但是仅仅表明这是一个amba_device还是不够的,因为amba_device包括了lcd控制器、ssp、中断控制器等多种设备。为了让ambe驱动识别设备的类型,amba_device在自己IO地址空间的尾部还存放了一个四字节的periphid,内核使用它来确认是否可以使用标准的amba驱动。
先说一下ARM对外设的编号采用PLXXX的形式,比如串口使用PL011的编号。
下面说一下periphid各位的含义:
PartNumber[11:0] 设备编号,比如串口(PL011)这部分的编号就是0x011.
DesignerID[19:12] 设计厂商编号,如果是ARM设计的对应0x41(ASCII码是‘A’)
Revision[23:20] 版本号,从0开始编号
Configuration[31:24] 配置选项,一般都是0.
在外设驱动中,提供了amba_id 来标示。例如:
static struct amba_id pl011_ids[] = {
{
.id = 0x00041011,
.mask = 0x000fffff,
.data = &vendor_arm,
}
};
2.设备注册
of_platform_bus_probe–>of_platform_bus_create–>
of_amba_device_create–>amba_device_add
3.总线注册
static int __init amba_init(void)
{
return bus_register(&amba_bustype);
}
postcore_initcall(amba_init);
struct bus_type amba_bustype = {
.name = "amba",
.dev_attrs = amba_dev_attrs,
.match = amba_match,
.uevent = amba_uevent,
.pm = AMBA_PM,
};
amba 设备总线驱动模型,可以对照platform 等常规总线驱动设备模型来分析即可。