7.6.2.代码分析
7.6.2.1. ledtest.c
没变。
7.6.2.2.leddrv.c
用代码对比看了下分层-分离的leddrv.c和platform的leddrv.c,主要区别新的leddrv.c中不再在led_init()中create deivces,而是独立成函数。
30: void led_class_create_device(int minor)
31: {
32: device_create(led_class, NULL, MKDEV(major, minor), NULL, "100ask_led%d", minor);
32: /* /dev/100ask_led0,1,... */
33: }
34: void led_class_destroy_device(int minor)
35: {
36: device_destroy(led_class, MKDEV(major, minor));
37: }
38: void register_led_operations(struct led_operations *opr)
39: {
40: p_led_opr = opr;
41: }
42:
43: EXPORT_SYMBOL(led_class_create_device); //export给驱动层使用
44: EXPORT_SYMBOL(led_class_destroy_device);
45: EXPORT_SYMBOL(register_led_operations);
其中,“EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。”视频:leddrv.c会编译成独立的.ko文件,其他文件如果调用该.ko中的函数,需要使用EXPORT_SYMBOL()将其导出。
底层文件chip_demo_gpio.c中定义led_opreation结构体board_demo_led_opr,定义了board_demo_led_init()和board_demo_led_ctl(),还定义了获取该结构体的获取函数get_board_led_opr()。而驱动层leddrv.c想使用该结构体对led操作就必须先获取到_init()和_ctl()函数,前提是先获取到结构体board_demo_led_opr,就得通过获取函数get_board_led_opr()获得,所以在leddrv.c中led_init()中先获取了p_led_opr = get_board_led_opr(),然后再给open()和write()使用。
而现在是把p_led_opr的获取单独定义成了一个函数,register_led_operations(),并没有去使