




已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
android button light 流程分析(一) driver 一、led-classled-class是button light driver的核心層,代碼位于drivers/leds/目錄下,提供了一些數(shù)據(jù)結(jié)構(gòu)和接口,其中創(chuàng)建了一個leds設(shè)備類,用于管理系統(tǒng)所有的led,代碼如下:cpp view plaincopyprint?1. staticint_initleds_init(void)2. 3. leds_class=class_create(THIS_MODULE,leds);4. if(IS_ERR(leds_class)5. returnPTR_ERR(leds_class);6. leds_class-suspend=led_suspend;7. leds_class-resume=led_resume;8. return0;9. 10. 11. staticvoid_exitleds_exit(void)12. 13. class_destroy(leds_class);14. 15. 16. subsys_initcall(leds_init);17. module_exit(leds_exit);static int _init leds_init(void)leds_class = class_create(THIS_MODULE, leds);if (IS_ERR(leds_class)return PTR_ERR(leds_class);leds_class-suspend = led_suspend;leds_class-resume = led_resume;return 0;static void _exit leds_exit(void)class_destroy(leds_class);subsys_initcall(leds_init);module_exit(leds_exit);創(chuàng)建成功后我們可以在/sys/class目錄下面看到leds目錄,并注冊了統(tǒng)一的休眠和喚醒函數(shù): cpp view plaincopyprint?1. /*2. *led_classdev_suspend-suspendanled_classdev.3. *led_cdev:theled_classdevtosuspend.4. */5. voidled_classdev_suspend(structled_classdev*led_cdev)6. 7. led_cdev-flags|=LED_SUSPENDED;8. led_cdev-brightness_set(led_cdev,0);9. 10. EXPORT_SYMBOL_GPL(led_classdev_suspend);11. 12. /*13. *led_classdev_resume-resumeanled_classdev.14. *led_cdev:theled_classdevtoresume.15. */16. voidled_classdev_resume(structled_classdev*led_cdev)17. 18. led_cdev-brightness_set(led_cdev,led_cdev-brightness);19. led_cdev-flags&=LED_SUSPENDED;20. 21. EXPORT_SYMBOL_GPL(led_classdev_resume);22. 23. staticintled_suspend(structdevice*dev,pm_message_tstate)24. 25. structled_classdev*led_cdev=dev_get_drvdata(dev);26. 27. if(led_cdev-flags&LED_CORE_SUSPENDRESUME)28. led_classdev_suspend(led_cdev);29. 30. return0;31. 32. 33. staticintled_resume(structdevice*dev)34. 35. structled_classdev*led_cdev=dev_get_drvdata(dev);36. 37. if(led_cdev-flags&LED_CORE_SUSPENDRESUME)38. led_classdev_resume(led_cdev);39. 40. return0;41. /* * led_classdev_suspend - suspend an led_classdev. * led_cdev: the led_classdev to suspend. */void led_classdev_suspend(struct led_classdev *led_cdev)led_cdev-flags |= LED_SUSPENDED;led_cdev-brightness_set(led_cdev, 0);EXPORT_SYMBOL_GPL(led_classdev_suspend);/* * led_classdev_resume - resume an led_classdev. * led_cdev: the led_classdev to resume. */void led_classdev_resume(struct led_classdev *led_cdev)led_cdev-brightness_set(led_cdev, led_cdev-brightness);led_cdev-flags &= LED_SUSPENDED;EXPORT_SYMBOL_GPL(led_classdev_resume);static int led_suspend(struct device *dev, pm_message_t state)struct led_classdev *led_cdev = dev_get_drvdata(dev);if (led_cdev-flags & LED_CORE_SUSPENDRESUME)led_classdev_suspend(led_cdev);return 0;static int led_resume(struct device *dev)struct led_classdev *led_cdev = dev_get_drvdata(dev);if (led_cdev-flags & LED_CORE_SUSPENDRESUME)led_classdev_resume(led_cdev);return 0;suspend主要設(shè)置一下標(biāo)志并將led關(guān)閉,resume主要清除標(biāo)志并將led恢復(fù)之前亮度。同時led-class提供了結(jié)構(gòu)體led_classdev作為統(tǒng)一的led設(shè)備模型: cpp view plaincopyprint?1. structled_classdev2. constchar*name;3. intbrightness;4. intmax_brightness;5. intflags;6. 7. /*Lower16bitsreflectstatus*/8. #defineLED_SUSPENDED(10) 9. /*Upper16bitsreflectcontrolinformation*/10. #defineLED_CORE_SUSPENDRESUME(116) 11. 12. /*SetLEDbrightnesslevel*/13. /*Mustnotsleep,useaworkqueueifneeded*/14. void(*brightness_set)(structled_classdev*led_cdev,15. enumled_brightnessbrightness);16. /*GetLEDbrightnesslevel*/17. enumled_brightness(*brightness_get)(structled_classdev*led_cdev);18. 19. /*Activatehardwareacceleratedblink,delaysarein20. *milisecondsandifnoneisprovidedthenasensibledefault21. *shouldbechosen.Thecallcanadjustthetimingsifitcant22. *matchthevaluesspecifiedexactly.*/23. int(*blink_set)(structled_classdev*led_cdev,24. unsignedlong*delay_on,25. unsignedlong*delay_off);26. 27. structdevice*dev;28. structlist_headnode;/*LEDDevicelist*/29. constchar*default_trigger;/*Triggertouse*/30. 31. #ifdefCONFIG_LEDS_TRIGGERS 32. /*Protectsthetriggerdatabelow*/33. structrw_semaphoretrigger_lock;34. 35. structled_trigger*trigger;36. structlist_headtrig_list;37. void*trigger_data;38. #endif 39. ;struct led_classdev const char*name;int brightness;int max_brightness;int flags;/* Lower 16 bits reflect status */#define LED_SUSPENDED(1 0)/* Upper 16 bits reflect control information */#define LED_CORE_SUSPENDRESUME(1 brightness_get)4. led_cdev-brightness=led_cdev-brightness_get(led_cdev);5. 6. 7. staticssize_tled_brightness_show(structdevice*dev,8. structdevice_attribute*attr,char*buf)9. 10. structled_classdev*led_cdev=dev_get_drvdata(dev);11. 12. /*nolockneededforthis*/13. led_update_brightness(led_cdev);14. 15. returnsprintf(buf,%un,led_cdev-brightness);16. 17. 18. staticssize_tled_brightness_store(structdevice*dev,19. structdevice_attribute*attr,constchar*buf,size_tsize)20. 21. structled_classdev*led_cdev=dev_get_drvdata(dev);22. ssize_tret=-EINVAL;23. char*after;24. unsignedlongstate=simple_strtoul(buf,&after,10);25. size_tcount=after-buf;26. 27. if(*after&isspace(*after)28. count+;29. 30. if(count=size)31. ret=count;32. 33. if(state=LED_OFF)34. led_trigger_remove(led_cdev);35. led_set_brightness(led_cdev,state);36. 37. 38. returnret;39. 40. 41. staticssize_tled_max_brightness_show(structdevice*dev,42. structdevice_attribute*attr,char*buf)43. 44. structled_classdev*led_cdev=dev_get_drvdata(dev);45. 46. returnsprintf(buf,%un,led_cdev-max_brightness);47. 48. 49. staticDEVICE_ATTR(brightness,0644,led_brightness_show,led_brightness_store);50. staticDEVICE_ATTR(max_brightness,0444,led_max_brightness_show,NULL);static void led_update_brightness(struct led_classdev *led_cdev)if (led_cdev-brightness_get)led_cdev-brightness = led_cdev-brightness_get(led_cdev);static ssize_t led_brightness_show(struct device *dev, struct device_attribute *attr, char *buf)struct led_classdev *led_cdev = dev_get_drvdata(dev);/* no lock needed for this */led_update_brightness(led_cdev);return sprintf(buf, %un, led_cdev-brightness);static ssize_t led_brightness_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)struct led_classdev *led_cdev = dev_get_drvdata(dev);ssize_t ret = -EINVAL;char *after;unsigned long state = simple_strtoul(buf, &after, 10);size_t count = after - buf;if (*after & isspace(*after)count+;if (count = size) ret = count;if (state = LED_OFF)led_trigger_remove(led_cdev);led_set_brightness(led_cdev, state);return ret;static ssize_t led_max_brightness_show(struct device *dev,struct device_attribute *attr, char *buf)struct led_classdev *led_cdev = dev_get_drvdata(dev);return sprintf(buf, %un, led_cdev-max_brightness);static DEVICE_ATTR(brightness, 0644, led_brightness_show, led_brightness_store);static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL);其中brightness主要用于設(shè)置和讀取亮度值,max_brightness則用于讀取硬件支持的最大亮度值。led-class還提供了注冊led_classdev的統(tǒng)一接口: cpp view plaincopyprint?1. /*2. *led_classdev_register-registeranewobjectofled_classdevclass.3. *parent:Thedevicetoregister.4. *led_cdev:theled_classdevstructureforthisdevice.5. */6. intled_classdev_register(structdevice*parent,structled_classdev*led_cdev)7. 8. intrc;9. 10. led_cdev-dev=device_create(leds_class,parent,0,led_cdev,11. %s,led_cdev-name);/在leds_class下創(chuàng)建設(shè)備 12. if(IS_ERR(led_cdev-dev)13. returnPTR_ERR(led_cdev-dev);14. 15. /*創(chuàng)建brightness屬性文件*/16. rc=device_create_file(led_cdev-dev,&dev_attr_brightness);17. if(rc)18. gotoerr_out;19. 20. #ifdefCONFIG_LEDS_TRIGGERS 21. init_rwsem(&led_cdev-trigger_lock);22. #endif 23. /*將該設(shè)備添加到鏈表leds_list*/24. down_write(&leds_list_lock);25. list_add_tail(&led_cdev-node,&leds_list);26. up_write(&leds_list_lock);27. 28. if(!led_cdev-max_brightness)29. led_cdev-max_brightness=LED_FULL;30. 31. rc=device_create_file(led_cdev-dev,&dev_attr_max_brightness);32. if(rc)33. gotoerr_out_attr_max;34. 35. led_update_brightness(led_cdev);/更新亮度值 36. 37. #ifdefCONFIG_LEDS_TRIGGERS 38. rc=device_create_file(led_cdev-dev,&dev_attr_trigger);39. if(rc)40. gotoerr_out_led_list;41. 42. led_trigger_set_default(led_cdev);43. #endif 44. 45. printk(KERN_INFORegisteredleddevice:%sn,46. led_cdev-name);47. 48. return0;49. 50. #ifdefCONFIG_LEDS_TRIGGERS 51. err_out_led_list:52. device_remove_file(led_cdev-dev,&dev_attr_max_brightness);53. #endif 54. err_out_attr_max:55. device_remove_file(led_cdev-dev,&dev_attr_brightness);56. list_del(&led_cdev-node);57. err_out:58. device_unregister(led_cdev-dev);59. returnrc;60. 61. EXPORT_SYMBOL_GPL(led_classdev_register);/* * led_classdev_register - register a new object of led_classdev class. * parent: The device to register. * led_cdev: the led_classdev structure for this device. */int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)int rc;led_cdev-dev = device_create(leds_class, parent, 0, led_cdev, %s, led_cdev-name); / 在leds_class下創(chuàng)建設(shè)備if (IS_ERR(led_cdev-dev)return PTR_ERR(led_cdev-dev);/* 創(chuàng)建brightness屬性文件 */rc = device_create_file(led_cdev-dev, &dev_attr_brightness);if (rc)goto err_out;#ifdef CONFIG_LEDS_TRIGGERSinit_rwsem(&led_cdev-trigger_lock);#endif/* 將該設(shè)備添加到鏈表leds_list */down_write(&leds_list_lock);list_add_tail(&led_cdev-node, &leds_list);up_write(&leds_list_lock);if (!led_cdev-max_brightness)led_cdev-max_brightness = LED_FULL;rc = device_create_file(led_cdev-dev, &dev_attr_max_brightness);if (rc)goto err_out_attr_max;led_update_brightness(led_cdev); / 更新亮度值#ifdef CONFIG_LEDS_TRIGGERSrc = device_create_file(led_cdev-dev, &dev_attr_trigger);if (rc)goto err_out_led_list;led_trigger_set_default(led_cdev);#endifprintk(KERN_INFO Registered led device: %sn,led_cdev-name);return 0;#ifdef CONFIG_LEDS_TRIGGERSerr_out_led_list:device_remove_file(led_cdev-dev, &dev_attr_max_brightness);#endiferr_out_attr_max:device_remove_file(led_cdev-dev, &dev_attr_brightness);list_del(&led_cdev-node);err_out:device_unregister(led_cdev-dev);return rc;EXPORT_SYMBOL_GPL(led_classdev_register);二、led-driver在平臺的驅(qū)動中我們注冊一個platform led設(shè)備作為所有l(wèi)ed設(shè)備的父設(shè)備,注冊代碼如下: cpp view plaincopyprint?1. staticstructplatform_driveratxxled_driver=2. .probe=atxxled_probe,3. .remove=atxxled_remove,4. .driver=5. .name=led,6. .owner=THIS_MODULE,7. ,8. ;9. 10. staticint_initatxxled_init(void)11. 12. returnplatform_driver_register(&atxxled_driver);13. 14. 15. staticvoid_exitatxxled_exit(void)16. 17. platform_driver_unregister(&atxxled_driver);18. 19. 20. module_init(atxxled_init);21. module_exit(atxxled_exit);static struct platform_driver atxxled_driver = .probe = atxxled_probe,.remove = atxxled_remove,.driver = .name = led,.owner = THIS_MODULE,;static int _init atxxled_init(void)return platform_driver_register(&atxxled_driver);static void _exit atxxled_exit(void)platform_driver_unregister(&atxxled_driver);module_init(atxxled_init);module_exit(atxxled_exit);然后再分別注冊每一個led: cpp view plaincopyprint?1. staticvoidatxxled_set(structled_classdev*led_cdev,enumATXX_LEDled,2. enumled_brightnessvalue)3. 4. intis_on=(value=LED_OFF)?0:1;5. enumpmu_led_moduleled_module;6. switch(led)7. caseRED_LED:8. led_module=PMU_LED_MODULE_2;9. break;10. caseGREEN_LED:11. led_module=PMU_LED_MODULE_1;12. break;13. default:14. return;15. break;16. 17. pmu_led_on_off_set(led_module,is_on,0);/led電源控制接口 18. 19. 20. staticvoidatxxled_green_set(structled_classdev*led_cdev,21. enumled_brightnessvalue)22. 23. atxxled_set(led_cdev,GREEN_LED,value);24. 25. 26. staticvoidatxxled_red_set(structled_classdev*led_cdev,27. enumled_brightnessvalue)28. 29. atxxled_set(led_cdev,RED_LED,value);30. 31. 32. staticvoidatxxled_buttons_set(structled_classdev*led_cdev,33. enumled_brightnessvalue)34. 35. enumpower_supply_modeis_on=(value=LED_OFF)?PPS_OFF:PPS_ON;36. pmu_led_on_off_set(PMU_LED_KEY_1,is_on,40);37. 38. 39. staticintatxxled_blink_set(structled_classdev*led_cdev,enumATXX_LEDled,40. unsignedlong*delay_on,unsignedlong*delay_off)41. 42. enumpmu_led_moduleled_module;43. switch(led)44. caseRED_LED:45. led_module=PMU_LED_MODULE_2;46. break;47. caseGREEN_LED:48. led_module=PMU_LED_MODULE_1;49. break;50. default:51. return0;52. break;53. 54. pmu_led_blink_set(led_module,delay_on,delay_off);/led閃爍控制接口 55. return0;56. 57. 58. staticintatxxled_green_blink_set(structled_classdev*led_cdev,59. unsignedlong*delay_on,unsignedlong*delay_off)60. 61. returnatxxled_blink_set(led_cdev,GREEN_LED,delay_on,delay_off);62. 63. 64. staticintatxxled_red_blink_set(structled_classdev*led_cdev,65. unsignedlong*delay_on,unsignedlong*delay_off)66. 67. returnatxxled_blink_set(led_cdev,RED_LED,delay_on,delay_off);68. 69. 70. staticintatxxled_buttons_blink_set(structled_classdev*led_cdev,71. unsignedlong*delay_on,unsignedlong*delay_off)72. 73. return-1;74. 75. 76. staticstructled_classdevatxx_red_led=77. .name=red,78. .brightness_set=atxxled_red_set,79. .blink_set=atxxled_red_blink_set,80. .flags=0,81. ;82. 83. staticstructled_classdevatxx_green_led=84. .name=green,85. .brightness_set=atxxled_green_set,86. .blink_set=atxxled_green_blink_set,87. .flags=0,88. ;89. 90. staticstructled_classdevatxx_buttons_led=91. .name=button-backlight,92. .brightness_set=atxxled_buttons_set,/led亮度調(diào)節(jié) 93. .blink_set=atxxled_buttons_blink_set,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨界車牌租賃與品牌合作合同
- 沉井施工安全教育培訓(xùn)及管理合同
- 急癥搶救室護(hù)理
- 餐飲服務(wù)業(yè)服務(wù)員培訓(xùn)與晉升體系合同范本
- 地質(zhì)測量儀器購銷與地質(zhì)勘察服務(wù)合同
- 特種車輛贈予及安全責(zé)任合同范本
- 《欠條保管期限及法律效力確認(rèn)合同》
- 拆遷安置補(bǔ)償與土地開發(fā)合同范本
- 離婚時遺產(chǎn)繼承與財(cái)產(chǎn)分割協(xié)議范例
- 分公司設(shè)立與跨境電商業(yè)務(wù)合作合同
- 精裝分包勞務(wù)合同協(xié)議書
- 2025-2030中國酸奶冰淇淋市場需求前景預(yù)測及投資效益盈利性研究報告
- 2025年高考英語應(yīng)用文第09講 讀后續(xù)寫分話題萬能結(jié)尾滿分句(講義)
- 圖像編輯基礎(chǔ)Photoshop試題及答案
- 新媒體國企面試題及答案
- 寶寶改姓夫妻協(xié)議書
- 2021入河(海)排污口三級排查技術(shù)指南
- 央企華潤集團(tuán)杭州片區(qū)年度品牌傳播策略案
- 2025年中考第一次模擬考試卷:地理(陜西卷)(解析版)
- 《社區(qū)公園》課件
- 2025年中考語文作文心理健康主題作文高分模板(分步詳解+例文示范)
評論
0/150
提交評論