學(xué)習(xí)平臺驅(qū)動有感
之前學(xué)習(xí)都是一遍帶過,今天回過頭來整理,在此記錄。
對于LED驅(qū)動框架,驅(qū)動程序的首要任務(wù)就是完成這個結(jié)構(gòu)體的實例的填充。
由于這里我們是打算使用平臺總線的方式實現(xiàn)LED驅(qū)動。因此,勢必還需要向內(nèi)核注冊一個struct platform_device的實例,如下:
在這個結(jié)構(gòu)體中,除了中斷、內(nèi)存的數(shù)據(jù)需要放進struct resource中,其他的數(shù)據(jù)(例如gpio)則需要放入平臺數(shù)據(jù)(paltform_data),位于struct platform_device中的struct device dev中,即platform_device.dev.platform_data。
也就是說,對于平臺總線設(shè)備,在內(nèi)核中應(yīng)當(dāng)有一個專門的結(jié)構(gòu)體用來存儲平臺總線數(shù)據(jù),即
struct platform_data,內(nèi)核有的話不需要額外添加,不然則需要自己添加。最后將這個結(jié)構(gòu)體以指針的形式放進struct platform_device中,向內(nèi)核注冊設(shè)備。
在s5pv210中,需要添加struct platform_data結(jié)構(gòu)體,因此在arch/arm/s5pv210的include/mach下新增了leds-gpio.h,用于添加struct platform_data。然后在mach-210.c中添加struct platform_data的實例,并在smkc110_machine_init中添加設(shè)備結(jié)構(gòu)體,以便在內(nèi)核初始化的時候注冊設(shè)備到內(nèi)核中。
一旦平臺驅(qū)動與平臺設(shè)備匹配成功后,驅(qū)動中的probe函數(shù)就會被執(zhí)行,在這個函數(shù)中,獲取設(shè)備信息:void dev_get_platdata(const struct device *dev);
對于led框架的驅(qū)動,在填充完struct led_classdev結(jié)構(gòu)體后,就可以調(diào)用int led_classdev_register(struct device *dev,struct led_classdev)向led驅(qū)動框架注冊驅(qū)動。