在linux驱动开发过程中,经常会使用到platform总线来开发,通过platform_driver_register()注册驱动,platform_device_register()来注册设备。如果在同一个platform bus下注册同name的device,那么会出现什么情况呢?
1、创建两个同名的platform_device
#define SWLED_DEV "sw_led"
static struct platform_device swled_plfdev1 = {
.name = SWLED_DEV,
};
static struct platform_device swled_plfdev2 = {
.name = SWLED_DEV,
};
2、注册platform_device与platform_driver
ret = platform_device_register(&swled_plfdev1);
ret = platform_device_register(&swled_plfdev2);
ret = platform_driver_register(&swled_plfdrv);
3、编译软件后烧录到板卡查看结果
系统启动后直接崩溃后重启,崩溃信息如下:
sysfs: cannot create duplicate filename '/devices/platform/sw_led.0'
[ 1.770270@2] CPU: 2 PID: 1 Comm: init Tainted: G WC O 5.4.125-android11-2-g88fd5a73906d-dirty-ab1656 #1
[ 1.771587@2] Hardware name: Amlogic (DT)
[ 1.772097@2] Call trace:
[ 1.772442@2] [ffffffc0200037f0+ 64][<ffffffc0100c63b4>] dump_backtrace+0x0/0x18c
[ 1.773387@2] [ffffffc020003830+ 32][<ffffffc0100c6564>] show_stack+0x24/0x34
[ 1.774300@2] [ffffffc020003850+ 80][<ffffffc010dcc6b8>] dump_stack+0xbc/0x108
[ 1.775220@2] [ffffffc0200038a0+ 64][<ffffffc0103bb810>] sysfs_create_dir_ns+0x104/0x160
[ 1.776248@2] [ffffffc0200038e0+ 176][<ffffffc010dd35bc>] kobject_add_internal+0x1e0/0x420
[ 1.777287@2] [ffffffc020003990+ 64][<ffffffc010dd2804>] kobject_add+0x88/0xdc
[ 1.778211@2] [ffffffc0200039d0+ 64][<ffffffc01076dfd8>] device_add+0x150/0xa48
[ 1.779142@2] [ffffffc020003a10+ 80][<ffffffc010777440>] platform_device_add+0x88/0x228
[ 1.780158@2] [ffffffc020003a60+ 32][<ffffffc01077702c>] platform_device_register+0x38/0x6c
[ 1.781228@2] [ffffffc020003a80+ 400][<ffffffc0099a0660>] swled_dev_init+0x58/0x9c [swoled]
[ 1.782273@2] [ffffffc020003c10+ 64][<ffffffc01008c748>] do_one_initcall+0x130/0x294
[ 1.783259@2] [ffffffc020003c50+ 240][<ffffffc0101aed78>] do_init_module+0x5c/0x21c
[ 1.784221@2] [ffffffc020003d40+ 240][<ffffffc0101aec18>] load_module+0x3a3c/0x3aac
[ 1.785184@2] [ffffffc020003e30+ 48][<ffffffc0101a9964>] __arm64_sys_finit_module+0xbc/0xd8
[ 1.786248@2] [ffffffc020003e60+ 64][<ffffffc0100d1408>] el0_svc_common+0xb0/0x188
[ 1.787210@2] [ffffffc020003ea0+ 336][<ffffffc0100d150c>] el0_svc_compat_handler+0x2c/0x3c
[ 1.788250@2] [ffffffc020003ff0+ 0][<ffffffc010083524>] el0_svc_compat+0x8/0x24
[ 1.789504@2] kobject_add_internal failed for sw_led.0 with -EEXIST, don't try to register things with the same name in the same directory.
......
[ 1.854730@3] swapper pgtable: 4k pages, 39-bit VAs, pgdp=0000000002193000
[ 1.855565@3] [ffffffc0099a4260] pgd=00000000adbff003, pud=00000000adbff003, pmd=00000000a4597003, pte=0000000000000000
[ 1.856920@3] Internal error: Oops: 96000007 [#1] PREEMPT SMP
......
[ 1.878500@3] CPU: 3 PID: 27 Comm: kworker/3:0 Tainted: G WC O 5.4.125-android11-2-g88fd5a73906d-dirty-ab1656 #1
[ 1.879905@3] Hardware name: Amlogic (DT)
[ 1.880428@3] Workqueue: events deferred_probe_work_func
[ 1.881088@3] pstate: 60c00109 (nZCv dAif +PAN +UAO)
[ 1.881720@3] pc : __list_del_entry_valid+0x40/0xa4
[ 1.882335@3] lr : device_reorder_to_tail+0x50/0x11c
从崩溃信息可得到原因:sysfs下同一个目录不能创建同名的文件夹。