???万字长文玩转总线设备驱动platform_device与platform_( 二 )

#include #include #include #include "led_opr.h"#include "leddrv.h"#include "led_resource.h"static int g_ledpins[100];static int g_ledcnt = 0;static int board_demo_led_init (int which) /* 初始化LED, which-哪个LED */{//printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which);printk("init gpio: group %d, pin %d\n", GROUP(g_ledpins[which]), PIN(g_ledpins[which]));switch(GROUP(g_ledpins[which])){case 0:{printk("init pin of group 0 ...\n");break;}case 1:{printk("init pin of group 1 ...\n");break;}case 2:{printk("init pin of group 2 ...\n");break;}case 3:{printk("init pin of group 3 ...\n");break;}}return 0;}static int board_demo_led_ctl (int which, char status) /* 控制LED, which-哪个LED, status:1-亮,0-灭 */{//printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off");printk("set led %s: group %d, pin %d\n", status ? "on" : "off", GROUP(g_ledpins[which]), PIN(g_ledpins[which]));switch(GROUP(g_ledpins[which])){case 0:{printk("set pin of group 0 ...\n");break;}case 1:{printk("set pin of group 1 ...\n");break;}case 2:{printk("set pin of group 2 ...\n");break;}case 3:{printk("set pin of group 3 ...\n");break;}}return 0;}static struct led_operations board_demo_led_opr = {.init = board_demo_led_init,.ctl= board_demo_led_ctl,};struct led_operations *get_board_led_opr(void){return &board_demo_led_opr;}static int chip_demo_gpio_probe(struct platform_device *pdev){struct resource *res;int i = 0;while (1){res = platform_get_resource(pdev, IORESOURCE_IRQ, i++);if (!res)break;g_ledpins[g_ledcnt] = res->start;led_class_create_device(g_ledcnt);g_ledcnt++;}return 0;}static int chip_demo_gpio_remove(struct platform_device *pdev){struct resource *res;int i = 0;while (1){res = platform_get_resource(pdev, IORESOURCE_IRQ, i);if (!res)break;led_class_destroy_device(i);i++;g_ledcnt--;}return 0;}static struct platform_driver chip_demo_gpio_driver = {.probe= chip_demo_gpio_probe,.remove= chip_demo_gpio_remove,.driver= {.name= "100ask_led",},};static int __init chip_demo_gpio_drv_init(void){int err;err = platform_driver_register(&chip_demo_gpio_driver); register_led_operations(&board_demo_led_opr);return 0;}static void __exit lchip_demo_gpio_drv_exit(void){platform_driver_unregister(&chip_demo_gpio_driver);}module_init(chip_demo_gpio_drv_init);module_exit(lchip_demo_gpio_drv_exit);MODULE_LICENSE("GPL");
3.2资源设备案例
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "led_resource.h"static void led_dev_release(struct device *dev){}static struct resource resources[] = {{.start = GROUP_PIN(3,1),.flags = IORESOURCE_IRQ,.name = "100ask_led_pin",},{.start = GROUP_PIN(5,8),.flags = IORESOURCE_IRQ,.name = "100ask_led_pin",},};static struct platform_device board_A_led_dev = {.name = "100ask_led",.num_resources = ARRAY_SIZE(resources),.resource = resources,.dev = {.release = led_dev_release,},};static int __init led_dev_init(void){int err;err = platform_device_register(&board_A_led_dev);return 0;}static void __exit led_dev_exit(void){platform_device_unregister(&board_A_led_dev);}module_init(led_dev_init);module_exit(led_dev_exit);MODULE_LICENSE("GPL");