- 博客(10)
- 收藏
- 关注
原创 uboot_initf_dm
initf_dm 在代码重定位之前运行.dm_init_and_scandm_initof_live == false;lists_driver_lookup_name遍历".u_boot_list_2_driver_1"和".u_boot_list_2_driver_3"这两个段中间,所有struct driver.所有struct driver定义时,就指定保存在这两个段中.宏定义展开后:定义_u_boot_list_2_driver_root_driver全局变量,保存在".u_
2022-07-01 13:33:06 357 1
原创 设备树生成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 823
原创 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 761
原创 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 341
原创 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 163
原创 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 219
原创 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 191
原创 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 509
原创 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 562
原创 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 323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人