platform总线的匹配方式( 三 )


第 23 行,name 表示设备名字,要和所使用的驱动的 name 字段相同,否则的话设备就无法匹配到对应的驱动 。比如对应的驱动的 name 字段为“xxx-gpio”,那么此 name字段也要设置为“xxx-gpio” 。
第 27 行,表示资源数量,一般为第 28 行资源的大小 。
第 28 行,表示资源,也就是设备信息,比如外设寄存器等 。Linux 内核使用 结构体表示资源,结构体内容如下:
18 struct resource {19 resource_size_t start;20 resource_size_t end;21 const char *name;22 unsigned long flags;23 struct resource *parent, *sibling, *child;24 };//start 和 end 分别表示资源的起始和终止信息,//对于内存类的资源,就表示内存起始和终止地址,name 表示资源名字,flags 表示资源类型
资源类型
29 #define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */30 31 #define IORESOURCE_TYPE_BITS 0x00001f00 /* Resource type */32 #define IORESOURCE_IO 0x00000100 /* PCI/ISA I/O ports */33 #define IORESOURCE_MEM 0x0000020034 #define IORESOURCE_REG 0x00000300 /* Register offsets */35 #define IORESOURCE_IRQ 0x0000040036 #define IORESOURCE_DMA 0x0000080037 #define IORESOURCE_BUS 0x00001000......104 /* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */105 #define IORESOURCE_PCI_FIXED (1<<4) /* Do not move resource */
在不支持设备树的Linux 版本中,用户需要编写变量来描述设备信息,然后使用 ster 函数将设备信息注册到 Linux 内核中
int ster(*pdev)
void (*pdev)
示例
1 /* 寄存器地址定义*/2 #define PERIPH1_REGISTER_BASE (0X20000000) /* 外设 1 寄存器首地址 */ 3 #define PERIPH2_REGISTER_BASE (0X020E0068) /* 外设 2 寄存器首地址 */4 #define REGISTER_LENGTH 45 6 /* 资源 */7 static struct resource xxx_resources[] = {8[0] = {9.start = PERIPH1_REGISTER_BASE,10.end = (PERIPH1_REGISTER_BASE + REGISTER_LENGTH - 1),11.flags = IORESOURCE_MEM,12}, 13[1] = {14.start = PERIPH2_REGISTER_BASE,15.end = (PERIPH2_REGISTER_BASE + REGISTER_LENGTH - 1),16.flags = IORESOURCE_MEM,17},18 };1920 /* platform 设备结构体 */21 static struct platform_device xxxdevice = {22.name = "xxx-gpio",23.id = -1,24.num_resources = ARRAY_SIZE(xxx_resources),25.resource = xxx_resources,26 };27 28 /* 设备模块加载 */29 static int __init xxxdevice_init(void)30 {31return platform_device_register(&xxxdevice);32 }3334 /* 设备模块注销 */35 static void __exit xxx_resourcesdevice_exit(void)36 {37platform_device_unregister(&xxxdevice);38 }3940 module_init(xxxdevice_init);41 module_exit(xxxdevice_exit);42 MODULE_LICENSE("GPL");
根文件系统中/sys/bus//目录下保存着当前板子总线下的设备和驱动,其中 子目录为设备,子目录为驱动 。
与 的匹配示例 示例:
88 static struct platform_device leddevice = {89 .name = "imx6ul-led",90 .id = -1,91 .dev = {92 .release = &led_release,93 },94 .num_resources = ARRAY_SIZE(led_resources),95 .resource = led_resources,};与229 static struct platform_driver led_driver = {230 .driver = {231 .name = "imx6ul-led", /* 驱动名字,用于和设备匹配 */232 },233 .probe = led_probe,234 .remove = led_remove,235 };
看/sys/bus///目录,看看我们的设备是否存在,( 类型)的name 字段为“-led”;在/sys/bus///目录下存在一个名字“-led”的文件,否则说明我们的设备模块加载失败 。
设备树的的匹配方式
在使用设备树的时候,设备的描述被放到了设备树中,因此就不需要我们去编写了,我们只需要实现即可 。
1、在设备树中创建设备节点
1 gpioled {2 #address-cells = <1>;3 #size-cells = <1>;4 compatible = "atkalpha-gpioled";5 pinctrl-names = "default";6 pinctrl-0 = <&pinctrl_led>;7 led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;8 status = "okay";9 };
2、编写驱动的时候要注意兼容属性