今天学习了注册平台设备,写文备忘。
注册设备
今天学习的注册设备的方法是将设备注册到platform上。
platform_device
platform_device是描述平台设备的结构体,一个结构体就代表一个平台设备。位于include/linux/platform_device.h文件中。
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
const struct platform_device_id *id_entry;
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
注册设备
step1
我的开发板的platform device的注册在arch/arm/mach-exynos/mach-itop4412.c文件中。
参考其它设备声明,注册一个s3c_device_hello_ctl。其中name为设备的名称,在挂载驱动时,Linux会匹配驱动中的设备name与设备列表中的name。
#ifdef CONFIG_HELLO_CTL
struct platform_device s3c_device_hello_ctl = {
.name = "hello_ctl",
.id = -1,
};
#endif
#ifdef CONFIG_LEDS_CTL
struct platform_device s3c_device_leds_ctl = {
.name = "leds",
.id = -1,
};
#endif
#ifdef CONFIG_BUZZER_CTL
struct platform_device s3c_device_buzzer_ctl = {
.name = "buzzer_ctl",
.id = -1,
};
#endif
#ifdef CONFIG_ADC_CTL
struct platform_device s3c_device_adc_ctl = {
.name = "adc_ctl",
.id = -1,
};
#endif
step2
定义了设备的platform_device结构体后,需要将其加入设备列表中,同样参考现有设备加入上面声明好的设备。
static struct platform_device *smdk4x12_devices[] __initdata = {
//省略
#ifdef CONFIG_LEDS_CTL
&s3c_device_leds_ctl,
#endif
#ifdef CONFIG_BUZZER_CTL
&s3c_device_buzzer_ctl,
#endif
#ifdef CONFIG_ADC_CTL
&s3c_device_adc_ctl,
#endif
//省略
};
step3
想要将设备编译进内核,还需要用menuconfig将其加入内核。在文件drivers/char/Kconfig中加入设备的选项,同样参考现有设备来写。
config LEDS_CTL
bool "Enable LEDS config"
default y
help
Enable LEDS config
config HELLO_CTL
tristate "Enable HELLO config"
default y
help
Enable HELLO config
config BUZZER_CTL
bool "Enable BUZZER config"
default n
help
Enable BUZZER config
此时make menuconfig,然后选择Devices drivers->character drivers就可以看到设备的配置了。
step4
make zImage,然后烧写。在板子上ls /sys/devices/platform/就可以看到注册好的平台设备啦。