前面介紹了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

我們先來分析下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下我們自己的節點。
大家可以看到我們自己的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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
