什么是AMBA? --- AMBA是一个片内总线规范。

ARM官网的介绍: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0224b/index.html
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提供的片内外设可以从官网查看: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0224b/index.html
由于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 *);
看一个具体的例子: http://lxr.linux.no/linux+v3.2.9/arch/arm/mach-lpc32xx/phy3250.c#L152
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

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

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

转自:http://blog.csdn.net/yuanlulu/article/details/7339836

amba_device使用分析相关推荐

  1. [转载]amba_device使用分析

    什么是AMBA? --- AMBA是一个片内总线规范. ARM官网的介绍: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dd ...

  2. Linux下spi驱动分析与测试【详细流程】

    驱动是基于ARM的pl022的SSP控制器,其支持三种通信格式:SPI.SSI以及Microwrite,llinux5.4内核下,SSP控制器驱动的路径为/drivers/spi/spi-pl022. ...

  3. linux pl320 mbox控制器驱动分析-(3) pl320驱动代码分析

    linux pl320 mbox控制器驱动分析-(3)pl320驱动代码分析 1 pl320 mbox控制器宏定义 2 初始化接口 3 ipc_handler mbox中断处理函数 4 数据的收发 4 ...

  4. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  5. 2022-2028年中国自动驾驶系统行业现状调研分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国自动驾驶系统行业市场行业相关概述.中国自 ...

  6. 2022-2028年中国阻尼涂料市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻尼涂料行业市场行业相关概述.中国阻尼涂 ...

  7. 2021-2028年中国阻燃装饰行业市场需求与投资规划分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻燃装饰行业市场行业相关概述.中国阻燃装 ...

  8. 2022-2028年全球与中国漂白吸水棉市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国漂白吸水棉行业市场行业相关概述.全 ...

  9. 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国青苔清洗剂行业市场行业相关概述.全 ...

最新文章

  1. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )
  2. 全卷积网络的理解——理解论文Fully Convolutional Networks for Semantic Segmentation
  3. 大数据新手之路二:安装Flume
  4. JavaScript 判断浏览器类型
  5. weixin微信公众号一站到底游戏代码(有点普通)
  6. ubuntu下安装RabbitVCS(失败记录)
  7. 【Elasticsearch】Elasticsearch 集群协调迎来新时代
  8. 一个项目了解 SpringBoot 集成 MyBatis
  9. 13分钟,教你python可视化分析20W数据,找到妹子最爱的内衣
  10. 实现C++与C的混合编程
  11. 小鱼易连 for mac常见问题解答
  12. c51流水灯实验报告汇编语言,LED流水灯显示实验,单片机实验报告
  13. Ps 2022 版新增功能及改进
  14. vue结合饿了么_饿了么vue实现学习笔记
  15. 大数据面试之新浪面试题
  16. 新注册企业调查显示:近9成初创小微企业融资难
  17. Bootstrap 中的 aria-label 和 aria-labelledby
  18. ‘tensorflow.python.framework.ops.EagerTensor‘ object has no attribute ‘reshape‘
  19. 关于pom.xml一直提示Could not transfer artifact(无法搬运)+无法解析maven依赖(更新)的问题,我在学习springboot的过程中遇到的一些问题(持续更新中)
  20. 刨根问底,5问分析法

热门文章

  1. 高可用 - 01 闲聊高性能集群
  2. 红黑树----红黑树插入和删除结点的全程演示
  3. springer science latex模板识别不到算法的\KwIn
  4. hexo next主题为博客添加分享功能
  5. c# winform LED数字时钟控件
  6. 树莓派使用命令行配置wifi连接
  7. java 8 第15篇 给定数字,输出先前的所有的质素和非质素(优化)
  8. JavaScript小知识:什么是IIFE?
  9. 百度和高德手机导航全部免费使用,其他导航厂商将何去何从?
  10. 常见Python自动化测试面试题(含答案)建议收藏!