什么是AMBA? ---AMBA是一个片内总线规范。
AMBA 协议是用于连接和管理片上系统 (SoC) 中功能块的开放标准和芯片上互连规范。使用它,可以帮助开发带有大量控制器和外设的多处理器设计。AMBA 通过使用 ACE、AXI、AHB、APB 和 ATB 的规范对 SoC 模块的共同主干进行定义,这有助于设计的重复使用。
 
看一则新闻:
ARM公司日前宣布推出用于嵌入式系统设计的下一代ARM PrimeCell AMBA 3 AXI Configurable Interconnect(PL301)和AMBA Designer Ecosystem Edition设计自动化工具。
 
为什么需要amba_device? ---为了复用驱动

单词解释:
peripheral :外围 [部]设备;[周围的,周边的]
 
内核中专门定义了一类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驱动。
关于periphid的定义,网上有人做了总结:http://hi.baidu.com/serial_story/blog/item/8af9a216cdd1495af2de327d.html
先说一下ARM对外设的编号采用PLXXX的形式,比如SSP使用PL022的编号。
下面说一下periphid各位的含义:
PartNumber[11:0]         设备编号,比如ssp(PL022)这部分的编号就是0x022.
DesignerID[19:12]         设计厂商编号,如果是ARM设计的对应0x41(ASCII码是‘A’)
Revision[23:20]             版本号,从0开始编号
Configuration[31:24]      配置选项,一般都是0.
 
amba_driver

linux/include/amba/bus.h
struct amba_id {
     unsigned int          id;
     unsigned int          mask;
     void               *data;  //这个成员好像没用到。内核中看不到使用
};

struct amba_driver {
     struct device_driver     drv;
     int               (*probe)(struct amba_device *, struct amba_id *);
     int               (*remove)(struct amba_device *);
     void               (*shutdown)(struct amba_device *);
     int               (*suspend)(struct amba_device *, pm_message_t);
     int               (*resume)(struct amba_device *);
     struct amba_id          *id_table;
};

amba_driver的结构体唯一亮点就是一个id_table指针,这个指针指向一个数组,数组中保存了此驱动可以支持的设备列表。
 
amba_bustype匹配设备和驱动的算法如下:
ret = (dev->periphid & table->mask) == table->id;
 
接口:
int amba_driver_register(struct amba_driver *);
void amba_driver_unregister(struct amba_driver *);
 
amba_device

linux/include/amba/bus.h
#define AMBA_NR_IRQS     2

struct amba_device {
     struct device              dev;   
     struct resource           res;
     u64                           dma_mask;
     unsigned int               periphid;
     unsigned int               irq[AMBA_NR_IRQS];
};

 
一般要初始化的成员有:
dev.init_name: 设备名,这个是必须的
dev.coherent_dma_mask:一般初始化为~0
dev.platform_data:这个指针指向设备的数据,具体的内容由驱动决定。
 
res:这个成员一般是设备本身的IO内存空间地址。
dma_mask:一般初始化为~0
irq:可以初始化为 {IRQ_XXX, NO_IRQ},或者都初始化为NO_IRQ
 
接口:
int amba_device_register(struct amba_device *, struct resource *);  //目前第二个参数必须是&iomem_resource
void amba_device_unregister(struct amba_device *);
 
static struct clcd_board lpc32xx_clcd_data = {
     .name          = "Phytec LCD",
     .check          = clcdfb_check,
     .decode          = clcdfb_decode,
     .disable     = clcd_disable,
     .enable          = clcd_enable,
     .setup          = lpc32xx_clcd_setup,
     .mmap          = lpc32xx_clcd_mmap,
     .remove          = lpc32xx_clcd_remove,
};

static struct amba_device lpc32xx_clcd_device = {
     .dev                    = {
          .coherent_dma_mask     = ~0,
          .init_name          = "dev:clcd",
          .platform_data          = &lpc32xx_clcd_data,
     },
     .res                    = {
          .start               = LPC32XX_LCD_BASE,
          .end               = (LPC32XX_LCD_BASE + SZ_4K - 1),
          .flags               = IORESOURCE_MEM,
     },
     .dma_mask               = ~0,
     .irq                    = {IRQ_LPC32XX_LCD, NO_IRQ},
};

这个是LCD控制器的amba_device定义,注册方式为:
amba_device_register(&lpc32xx_clcd_device, &iomem_resource);
 
amba在sysfs中的目录

[root@M3250 sys]# ls  bus/amba/devices/
dev:clcd@ dev:mmc0@ dev:ssp0@
[root@M3250 sys]# ls  bus/amba/drivers
clcd-pl11x/ mmci-pl18x/ ssp-pl022/
[root@M3250 sys]# ls  bus/amba/devices/dev\:clcd
bus@       id         power/     subsystem@
driver@    irq0       resource   uevent
[root@M3250 sys]# cat   bus/amba/devices/dev\:clcd/id            #periphid
00141111
[root@M3250 sys]# cat   bus/amba/devices/dev\:clcd/irq0  
14
[root@M3250 sys]# cat   bus/amba/devices/dev\:clcd/uevent
DRIVER=clcd-pl11x
PHYSDEVBUS=amba
PHYSDEVDRIVER=clcd-pl11x
AMBA_ID=00141111
[root@M3250 sys]# cat   bus/amba/devices/dev\:clcd/resource
        0000000031040000        0000000031040fff        0000000000000200   #start   end   size
 
============================================
作者:yuanlulu
http://blog.csdn.net/yuanlulu

版权没有,但是转载请保留此段声明

============================================

[转载]amba_device使用分析的更多相关文章

  1. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  2. [转载] JaCoCo:分析单元测试覆盖率的利器

    转载自http://www.ibm.com/developerworks/cn/java/j-lo-jacoco/和http://www.cnblogs.com/chenfengmugu/p/4937 ...

  3. [转载] ConcurrentHashMap原理分析

    转载自http://blog.csdn.net/liuzhengkang/article/details/2916620 集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的 ...

  4. [转载]JavaScript内存分析

    https://github.com/CN-Chrome-DevTools/CN-Chrome-DevTools/blob/master/md/Performance-Profiling/javasc ...

  5. 【转载】非线性分析中的ansys跟踪显示

    原文地址:http://muchong.com/html/201209/4936556.html 在ansys output windows 有 force convergenge valu 值 和 ...

  6. [转载]Android核心分析

    2013-12-19 15:44:03 转载自: http://blog.csdn.net/column/details/androidcore.html 很好的文章,阅读请跳转到转载链接,转载备以后 ...

  7. (转载)shell日志分析常用命令

    shell日志分析常用命令总结 时间:2016-03-09 15:55:29来源:网络 导读:shell日志分析的常用命令,用于日志分析的shell脚本,统计日志中百度蜘蛛的抓取量.抓取最多的页面.抓 ...

  8. 转载: Nova-Router 分析

    很早的实现了,nova代码已经做了很多修改了. 以创建实例 URL(http://10.191.7.32:8773/v1.1/service?*****)为例说明 Router 的执行流程 1. 依据 ...

  9. [转载] Tomcat架构分析

    转载自http://gearever.iteye.com/category/223001

随机推荐

  1. JavaScript tips —— target与currentTarget的区别

    定义 以下是红宝书的描述 属性/方法 类型 读/写 说明 currentTarget Element 只读 其事件处理程序当前正在处理事件的那个元素 target Element 只读 事件的目标 M ...

  2. 2015 Syrian Private Universities Collegiate Programming Contest

    A. Window B. Paper Game Des:给你一个矩形集合,一开始只有一个W*H的矩形.每次可以选一个矩形,切成两个并加入集合,长和宽必须是正整数.不能操作者输,求先手赢还是输.(1 ≤ ...

  3. python递归列出目录及其子目录下所有文件

    python递归列出目录及其子目录下所有文件 一.前言 函数的递归,简单来说,就是函数内部调用自己 先举个小例子,求阶乘 def factorial(n): if n == 0: return 1 e ...

  4. python下的复杂网络编程包networkx的使用(摘抄)

    原文:http://blog.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&classid=141080&vi ...

  5. XamlParseException异常

    一般出现System.Windows.Markup.XamlParseException的错误是由1.dll库加载错误,查询一下你程序中引用的dll你是否加载并引用到程序内.2.程序中引用的文件(tx ...

  6. Django进阶Model篇003 - 数据库同步技巧

    一.认识一个目录 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必须要有migrations ...

  7. saltstack笔记

    Saltstack类似于puppet salt的核心功能使用命令 发送到远程系统是并行的而不是串行的使用安全加密的协议使用最小最快的网络载荷提供简单的编程接口 Python编写,相当轻量级通讯层采用z ...

  8. vue项目中报常见错误

    最近做项目,添加了less样式之后报错, 添加了如下样式: 报错如下图: 于是,就把相关的依赖也都安装了 以为这样会好使啦,后来发现原来是vue-style-loader的问题, 安装的vue-sty ...

  9. c#的DateTime.Now详解

    (转自:http://www.cnblogs.com/lida/archive/2011/01/02/1924197.html) //2008年4月24日 System.DateTime.Now.To ...

  10. IIS(IISReset.exe)命令行

    (转自:http://www.cnblogs.com/itech/archive/2009/05/18/1459231.html) 一 IIS命令行 Iisreset.exe 的概述 Iisreset ...