为更好地理解platform_device,platform_driver,platform_bus_type之间的关系,本博文以leds-gpio为例做一个讲解,硬件平台是am335x评估板.该节描述platform_device相关的内容.
1.定义platform_device设备leds_gpio
static struct platform_device leds_gpio = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &gpio_led_info,
},
};
以上代码定义了一个platform_device,其中平台相关的数据platform_data成员保存的是gpio_led_info指针, gpio_led_info定义如下
struct gpio_led_platform_data {
int num_leds; // led灯个数
const struct gpio_led *leds; // led灯数组
#define GPIO_LED_NO_BLINK_LOW 0 /* No blink GPIO state low */
#define GPIO_LED_NO_BLINK_HIGH 1 /* No blink GPIO state high */
#define GPIO_LED_BLINK 2 /* Please, blink */
int (*gpio_blink_set)(unsigned gpio, int state,
unsigned long *delay_on,
unsigned long *delay_off);
};
static struct gpio_led_platform_data gpio_led_info = {
.leds = gpio_leds,// led灯数组
.num_leds = ARRAY_SIZE(gpio_leds),// led灯个数
};
2.platform_device设备leds_gpio 注册
static void gpio_led_init(int evm_id, int profile)
{
......
err = platform_device_register(&leds_gpio);
......
}
platform_device_register函数的调用过程如下:
arch_initcall(customize_machine);//.initcall3.init
customize_machine()->init_machine()->am335x_evm_init()->am335x_evm_setup()->setup_dk()->_configure_device()->gpio_led_init()->platform_device_register();
platform_device_register调用主要实现以下功能:
1).创建/sys/devices/platform/leds-gpio目录
2).创建连接/sys/bus/platform/devices/leds-gpio -> /sys/devices/platform/leds-gpio
3).创建连接/sys/devices/platform/leds-gpio/subsystem -> ./sys/bus/platform
3).添加设备到platform_bus_type->p->klist_devices列表
4).添加device到platform_bus树
5).匹配驱动