![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
linux驱动
linux驱动。
vivy89
这个作者很懒,什么都没留下…
展开
-
设备树生成platform_device过程
of_platform_default_populateof_platform_populate查找of_default_bus_match_table列表中compatible属性的节点,遍历其子节点,调用of_platform_bus_create.root等于NULL,从设备树根节点开始扫描.为当前设备树节点创建device, 并递归遍历子节点,同样创建device.没有compatible属性则忽略.分配内存,初始化并注册platform_device.status属性不为"oka原创 2022-07-01 13:31:33 · 762 阅读 · 0 评论 -
platform_driver注册过程
platform_driver注册过程.__platform_driver_register设置总线类型为platform_bus_type.设置platform函数操作集合.platform device 和 driver 配置成功会调用这个函数.根据设备树设置时钟.调用drv->probe.调用platform_match进行匹配,优先级如下:driver_find查看driver防止重复注册.driver_private分配内存,初始化,关联bus.driver_attach进行原创 2022-07-01 13:30:20 · 683 阅读 · 0 评论 -
linux驱动之platform
linux驱动之platform平台驱动注册#define platform_driver_register(drv) \ __platform_driver_register(drv, THIS_MODULE)int __platform_driver_register(struct platform_driver *drv, struct module *owner){ //THIS_MODULE代表模块自身 drv->driver.owner = owner; //平台原创 2021-07-19 20:09:55 · 289 阅读 · 0 评论 -
linux驱动之platform_bus_init-2
linux驱动之platform_bus_init() 2代码drivers/base/platform.c drivers/base/bus.c分析bus_register()int __init platform_bus_init(void){ int error; early_platform_cleanup(); error = device_register(&platform_bus); ... error = bus_register(&platform_b原创 2021-06-24 22:10:07 · 135 阅读 · 0 评论 -
linux驱动之platform_bus_init 1
linux驱动之platform_bus_init() 1代码drivers/base/platform.c drivers/base/core.c一般情况驱动开发device_register()和bus_register()都不用调用devices一般通过设备树机制,内核自动创建。而绝大部分bus,内核已经注册好了。先分析device_register()内核启动时注册platform总线int __init platform_bus_init(void){ int error; e原创 2021-06-24 22:08:33 · 192 阅读 · 0 评论 -
linux驱动之buses_init
linux驱动之buses_init()通过buses_init()分析一下kset,kobject代码:driver/base/bus.clib/kobject.c内核启动阶段,生成/sys/bus目录static struct kset *bus_kset;int __init buses_init(void){ bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL); ... return 0;}ks原创 2021-06-22 13:12:47 · 161 阅读 · 0 评论 -
linux驱动之open
linux驱动之openopen()系统调用->sys_open()SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode){ ... return do_sys_open(AT_FDCWD, filename, flags, mode);}long do_sys_open(int dfd, const char __user *filename, int flags, umode_t原创 2021-06-22 09:16:14 · 461 阅读 · 0 评论 -
linux驱动之cdev
linux驱动之cdev代码在fs/char_dev.clinux下每一个具体的字符设备都会对应一个cdev,cdev->ops就是设备的操作接口。上层应用程序调用open()系统调用打开/dev/xxx设备节点时,最终会调用cdev->ops->open()。struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head原创 2021-06-21 15:14:41 · 513 阅读 · 0 评论 -
linux驱动之__register_chrdev
linux驱动之__register_chrdev_region()代码在fs/char_dev.c//这个哈希表保存主次设备号static struct char_device_struct { struct char_device_struct *next; unsigned int major; unsigned int baseminor; int minorct; char name[64]; struct cdev *cdev; /* will die */} *chrde原创 2021-06-21 13:50:20 · 304 阅读 · 0 评论