亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android模擬器學framework和driver之battery &

系統 2265 0

前面介紹了battery的相關的東西,現在我們來介紹下backlight模塊,背光主要是用來調節顯示屏亮度的,一般背光都是用PWM控制的,調節占空比達到改變有效電壓值來調節光的強弱。

背光的移植在linux中雖然不是那么難,但是背光這個組件對我們嵌入式設備的續航能力有很大的影響,一般背光上面加的電壓會有20多的電壓,所以這部分會很耗電的,相當于是開了個大燈泡。

現在我們先來看下android goldfish中的背光代碼,哈哈,沒找到吧,沒有,我們打開模擬器,看sysfs中,也是沒有具體的背光的文件的,所以這里我們得自己實現,自己寫代碼練習練習,畢竟這部分不是非常的難,參考drivers/video/backlight/下的pwm_bl.c文件,基本可以仿照,我們要做的事情很簡單,創建背光相關的文件系統即可,不需要去控制硬件做什么動作,因為我們本來就沒有硬件。

首先看下video中的makefile,如果backlight/沒有選中就選中它,不然我們的模塊不會編譯進去。然后再看下backlight/下的Makefile


這里沒有一個文件被編譯進去的,我們要把backlight.c先編譯進去,直接這樣改,我比較懶 呵呵呵,

然后重新編譯下會生成backlight.o文件,并且在sysfs中會生成我們的backlight class
Android模擬器學framework和driver之battery & backlight-----5. backlight in linux

我們先來分析下backlight.c中的代碼是如何實現的。

養成好習慣,看見代碼多不用怕,首先看init函數:


很簡單,這里只是用了class_create函數在sys/class下創建了backlight文件夾,然后是
backlight_class->dev_attrs = bl_device_attributes;
在backlight class中創建了一系列的文件系統,


所以我們的驅動只要填充好具體的結構體,初始化好文件系統就夠了,在sysfs中生成可以讓user space調用的接口,接下來的事情就交給上層開發人員去做。

ok,我們來看下我們自己寫的驅動, 在backlight文件夾下新建一個文件叫 android-backlight.c,我是參照pwm_bl.c來寫的,具體先來看下代碼,init函數


使用platform_driver_register注冊平臺驅動,看下傳入的參數:


這里我偷懶沒寫remove suspend和resume'回調函數,在移植具體驅動的時候我們都應該寫上,特別是suspend和resume函數,來看下我們paltform驅動的device_register是在哪做的,在arch/arm/mach-goldfish/board-goldfish.c


在init中進行注冊:


這邊android_backlight_data結構體主要是做一個背光的初始化。

接下來我們看一下probe函數,


首先檢查我們得到的platform_data結構體中有沒有init回調函數,有的話執行,沒有的話跳過。


這邊比較重要的是backlight_device_register函數


這里做的最主要的事情就是對一些結構體的初始化,然后調用device_register把我們具體的device掛到我們的backlight class下,具體的是如何實現的我這里不多說,我這里只做一些簡單的介紹。這里大家可以看到最重要的是backlight_device_register函數的最后一個參數,這里提供了我們可以自己定義的幾個回調函數,


我們這邊定義了2個回調函數掛上去:


然后我們去實現這2個函數,就基本完成了我們的驅動了,看函數名字就知道這2個函數的作用,一個是用來更新我們的背光亮度,還有一個是用來得到我們的光強。


這個函數比較簡單,就是返回backlight_device->props->brightness,我們來看下最終我們的brightness是哪里寫進去的。這里比較繞,我們還是結合update函數一起分析:


我們姑且這么理解,我們有一個結構體,brightness_properity用來存放backlight的一些屬性信息,比如說brightness,當我們要get_brightness的時候就是去返回這個brightness,當我們要調節光強的時候就是給這個結構體中的成員變量賦值。

首先我們要了解android中用戶層是怎么做的,因為我們linux driver最終的目標就是服務用戶層,所以我們要了解。

其實android HAL層就是open backlight中的brightness這個節點,然后進行讀寫來設置背光的亮度的,好吧,先來看下讀寫這個節點會呼叫的回調函數

在backlight.c中實現:


當我們向brightness這個文件節點中寫入我們要設置的背光亮度的時候會調用store這個回調函數,我們來看下主要做了哪些事情,跟我們在driver層自己寫的update函數到底有什么關系呢?

前面都是一大堆不用看的代碼,這里最重要的看這個


首先是把brightness寫進我們的背光屬性結構體中,這樣就更新了我們數據結構中的背光亮度在值,但是這樣做是不夠的,因為我們最終要控制的是硬件,所以看下之后我們調用了backlight_update_status函數,ok,看下這個函數的定義:

/include/linux/backlight.h


看下這個內聯函數,看到ops就知道了吧,這邊調用了bd->ops->update_status這里就調用到了我們自己寫的update_status回調函數:



這里咱也沒做什么,因為android模擬器沒有真正的背光的設備,我們打印了信息,還有就是一個notify回調函數,這里我們也沒有實現,這里我猜想就是這邊背光如果涉及到別的deivce的行為的話,這個notify函數可以通知到別的設備。

ok,這邊就介紹結束了,我們來啟動我們的android模擬器來看下sysfs中backlight下我們自己的節點。

Android模擬器學framework和driver之battery & backlight-----5. backlight in linux


大家可以看到我們自己的device的文件系統,我們cat 出來的brightness就是我們在board-goldfish.c中設置的初始值。

=====================================================

OK,這部分就介紹到這,下面一篇會介紹到我們HAL層中是如何封裝我們driver中的接口的。

Android模擬器學framework和driver之battery & backlight-----5. backlight in linux


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚色视频在线观看 | 免费人成在线观看网站品爱网 | 午夜视频免费国产在线 | aaaa一级片 | 激情四房 | 国产高清狼人香蕉在线观看 | 国产精品久久久久国产精品 | 日本免费毛片在线高清看 | 五月婷婷伊人 | 91久久亚洲最新一本 | 亚洲一区二区三区四区五区 | 欧美激情一区二区 | 99尹人香蕉国产免费天天拍 | 国产网友自拍视频 | 欧美一级毛片在线播放 | 极品女神西比尔久久精品 | 日本视频不卡 | 欧美视频久久久 | 日韩欧美一区在线观看 | 国产在线一91区免费国产91 | 日韩欧美亚洲国产精品字幕久久久 | 成年黄网站免费大全毛片 | 99国产高清久久久久久网站 | 四虎精品成人a在线观看 | 狼人综合伊人 | 91热久久免费频精品黑人99 | 超激情碰碰碰啪在线视频 | 精品伊人久久久99热这里只 | 国产免费一区二区三区香蕉精 | 看欧美毛片一级毛片 | 99精选视频 | 综合激情婷婷 | 亚洲精品久久9热 | 日日夜夜天天 | 亚洲视频欧洲视频 | 成人区精品一区二区毛片不卡 | 欧美毛片网 | 欧美一级视频精品观看 | 这里只有久久精品视频 | 久草久热| 日韩一区二区三区在线 |