从熟悉的开始。

设备驱动模型。
device
device driver
class
bus

dra7xx pcie驱动
bus:platform bus
device:platform_device
device driver: platform_driver
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
bool prevent_deferred_probe;
};

static struct platform_driver dra7xx_pcie_driver = {
.driver = {
.name = “dra7-pcie”,
.of_match_table = of_dra7xx_pcie_match,
.suppress_bind_attrs = true,
.pm = &dra7xx_pcie_pm_ops,
},
.shutdown = dra7xx_pcie_shutdown,
};

/* device_driver */
struct device_driver {
const char *name;
struct bus_type *bus;

struct module        *owner;
const char      *mod_name;  /* used for built-in modules */bool suppress_bind_attrs;    /* disables bind/unbind via sysfs */
enum probe_type probe_type;const struct of_device_id    *of_match_table;
const struct acpi_device_id *acpi_match_table;int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
void (*shutdown) (struct device *dev);
int (*suspend) (struct device *dev, pm_message_t state);
int (*resume) (struct device *dev);
const struct attribute_group **groups;const struct dev_pm_ops *pm;
void (*coredump) (struct device *dev);struct driver_private *p;

};

__platform_driver_register(drv, module);
int __platform_driver_register(struct platform_driver *drv,
struct module *owner)
{
drv->driver.owner = owner;
drv->driver.bus = &platform_bus_type;
drv->driver.probe = platform_drv_probe;
drv->driver.remove = platform_drv_remove;
drv->driver.shutdown = platform_drv_shutdown;

return driver_register(&drv->driver);
}

struct platform_device {
const char *name;
int id;
bool id_auto;
struct device dev;
u32 num_resources;
struct resource *resource;

const struct platform_device_id  *id_entry;
char *driver_override; /* Driver name to force a match *//* MFD cell pointer */
struct mfd_cell *mfd_cell;/* arch specific additions */
struct pdev_archdata    archdata;

};
platform_device 比struct device 多了,以下结构
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
unsigned long desc;
struct resource *parent, *sibling, *child;
};

/* arch specific additions */
struct pdev_archdata archdata;

Documentation\driver-model\platform.txt

Platform Devices and Drivers

This pseudo-bus is used to connect devices on busses with minimal infrastructure
like those used to integrate peripherals on many system-on-chip
processors, or some “legacy” PC interconnects; as opposed to large
formally specified ones like PCI or USB.

static void dra7xx_pcie_raise_legacy_irq(struct dra7xx_pcie *dra7xx)
{
dra7xx_pcie_writel(dra7xx, PCIECTRL_TI_CONF_INTX_ASSERT, 0x1);
mdelay(1);
dra7xx_pcie_writel(dra7xx, PCIECTRL_TI_CONF_INTX_DEASSERT, 0x1);
}

static void dra7xx_pcie_raise_msi_irq(struct dra7xx_pcie *dra7xx,
u8 interrupt_num)
{
u32 reg;

reg = (interrupt_num - 1) << MSI_VECTOR_SHIFT;
reg |= MSI_REQ_GRANT;
dra7xx_pcie_writel(dra7xx, PCIECTRL_TI_CONF_MSI_XMT, reg);

}

linux 设备驱动学习总结相关推荐

  1. linux设备驱动学习,linux设备驱动学习4

    Linux设备驱动程序学习(4) -高级字符驱动程序操作[(1)ioctl and llseek] 今天进入<Linux设备驱动程序(第3版)>第六章高级字符驱动程序操作的学习. 一.io ...

  2. linux设备驱动学习笔记(1)

    学习了将近半个月的设备驱动程序的编写,也有一些体会,这里写下来也给学习做一个总结,为后面的学习做更好的准备. 首先,个人感觉驱动程序的设计是很有套路的,最基本的要求就是要掌握这些套路.所谓的套路就是一 ...

  3. linux设备驱动学习(四)——阻塞与非阻塞I/O

    1.阻塞与非阻塞I/O介绍 阻塞和非阻塞I/O是设备访问的两种不同模式.阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的进程进入睡眠状态,被从调度器的 ...

  4. linux设备驱动学习(二)——字符设备编写及测试

    一.字符设备体结构介绍 1.字符设备作为linux内核三大驱动设备之一,主要完成字节的读写操作,常见的应用有鼠标.键盘等,结构体形式如下所示: struct cdev{ struct kobject ...

  5. linux设备驱动学习(一)——简单的helloworld模块

    在内核驱动中新建hello文件夹 1.需要.c文件与Makefile文件 在..../drivers/hello目录下新建xxx.c 和Makefile文件 .c文件样例: #include < ...

  6. linux设备驱动学习(三)——并发控制

    1.并发介绍 一般来说,操作系统都是支持并发执行能力的,多个执行单元访问同一个模块时,如果不能支持并发,则会让这个模块功能紊乱,像读写操作时.两个用户同时读写,那么可能一个用户执行读操作时,另一个用户 ...

  7. 如何学习linux设备驱动

    面对不断升级的内核,如何学习linux设备驱动   面对不断升级的linux内核.GNU开发工具.linux环境下的各种图形库,很多linux应用程序开发人员和linux设备驱动开发人员即兴奋,又烦躁 ...

  8. Linux内核学习-字符设备驱动学习(二)

    在Linux内核学习-字符设备驱动学习(一)中编写字符设备驱动的一种方法,但是需要手动创建设备节点. 有没有能够自动的创建设备节点的呢? 有!使用class_create()和device_creat ...

  9. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

最新文章

  1. 德国KubeCon直击:如何轻松且安心地将k8s用于生产?
  2. html教程自适应,Html-自适应
  3. 从零开始学习docker(九)持久化存储和数据共享之 Data Volume
  4. 应用机器学习进行无人机航拍影像质量评估
  5. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨寻找用户推荐人【难度简单】
  6. Zernike函数拟合曲面--MATLAB实现
  7. MySQL设置当前时间为默认值的方法
  8. mysql+视频文件转成流_视频文件自动转rtsp流
  9. STM32F103C8T6用官方bootloader实现IAP升级操作方法
  10. Frameset使用教程
  11. 一起谈.NET技术,C#中的lock关键字
  12. 次导数 次梯度 小结
  13. 量化投资的现状和前景
  14. 模拟停车场管理系统(栈和队列的应用)
  15. Python邮件附件保存
  16. 解决ppt的页码不显示的问题
  17. 移植智能ABC输入法到Windows XP
  18. 眼界 思维 意识 习惯
  19. P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值 + k幂次之和)
  20. 盘点2020年最好用的6大智能建站工具,建议收藏

热门文章

  1. 解决scp命令输入yes后卡住不动的问题
  2. (附源码)ssm汽车租赁 毕业设计 271621
  3. 开关电源电路原理与设计
  4. nxp管理芯片的通用分类与改变
  5. 文档怎么翻译?文档翻译工具有哪些?
  6. oracle创建用户表空间6,Oracle创建表空间,添加用户及授权
  7. #MySql MySql 计算今年有多少天周末(周六、日)
  8. 零散的JavaScript知识
  9. 短线高手快速看盘技巧
  10. python高考谣言_新浪微博中文谣言数据