針對s2121b_16t方案電池驅動進行詳細的分析和解讀過程如下:
首先我們和一般程式一樣找到它的電池驅動所在的位置,在當前專案中驅動檔案為: kernel/drivers/power/jz4775-battery-lut.c
當我們開啟該檔案時我們會發現它和一般的驅動檔案一樣,都有它的入口函式和退出函式,沒有什麼特別之處;下面我們先來了解下它的裝置註冊的過程,以幫助我們後面來了解它的驅動過程。**位於arch/mips/xburst/soc-4775/board/s2121b_16t/misc.c檔案中
/* adc*/#ifdef config_battery_jz4775_lut
jz_device_register(& jz_adc_device, &s2121b_16t_battery_pdata);
/* ac charger */
platform_device_register (& s2121b_16t_ac_charger_device) ;
/* li-ion charger */
platform_device_register (& s2121b_16t_li_ion_charger_device) ;
#endif
先來看看
jz_adc_device結構體做了那些初始化。
/* adc controller*/static struct resource
jz_adc_resources
= ,
,
,
};
struct platform_device再來看看平台註冊函式的具體的註冊過程。jz_adc_device
= ;
int從這裡我們基本看不出來它做了什麼事情,僅能看出它把jz_device_register
(struct platform_device *pdev,void *pdata)
s2121b_16t_battery_pdata賦給了pdev->dev.platform_data,我們繼續看platform_device_register(pdev)做了些什麼工作。
int從兩個函式介面的字面的意思們就可以知道,乙個是初始化裝置,而另外乙個函式介面是將該裝置加入到相應的平台下;如果覺得僅僅看看字面意思不夠嚴謹的話,我們可以具體看看它們主要的作用。先看device_initalize(&pdev->dev)函式介面:platform_device_register
(struct platform_device *pdev)
void對於裝置模型中有所了解的話,我們就可以簡單的發現該函式主要是將裝置新增到裝置層次關係和鍊錶中以便於訪問與管理;下面我們再來看看另外已乙個裝置新增介面函式。device_initialize
(struct device *dev)
/*初始化device結構*/
intplatform_device_add
(struct platform_device *pdev)
if (p && insert_resource(p, r))
}
pr_debug("registering platform device '%s'. parent at %s\n",dev_name(&pdev->dev), dev_name(pdev->dev.parent));
ret = device_add(&pdev->dev); // 新增裝置到裝置鍊錶中
if (ret == 0)
return ret;
failed: // 錯誤處理
while (--i >= 0)
return ret;}
關於平台匯流排的型別的初始化:
struct bus_type初一看我們不知道這個結構體的成員是什麼意思,只能通過字面意思來理解,那我們先把它放下,不管它的具體含義了,我們來簡單看看另外兩個註冊函式的註冊。platform_bus_type
= ;
我們一直在間接這些函式介面的功能,乎略了乙個重要的東西,那就是s2121b_16t_battery_pdata這兒結構的內容,下面我們來看看它的具體賦值:
static struct jz_battery_platform_data
s2121b_16t_battery_pdata
= , };
/* ac charger */};platform_device_register (&s2121b_16t_ac_charger_device ) ;
/* ac charger */
static char *
s2121b_16t_ac_supplied_to
= ;
static struct gpio_charger_platform_data
s2121b_16t_ac_charger_pdata
= ;
static struct platform_device
s2121b_16t_ac_charger_device
= ,
這個註冊函式和前面的註冊過程一樣,這裡我們只看看它的一些私有的基本資訊,以便於我們更好的理解驅動之間的關係。我再來簡單看看最後乙個註冊函式。
/* li-ion charger */};platform_device_register ( &s2121b_16t_li_ion_charger_device ) ;
/* li-ion charger */
static struct li_ion_charger_platform_data
s2121b_16t_li_ion_charger_pdata
= ;
static struct platform_device
s2121b_16t_li_ion_charger_device
= ,
這個函式值註冊鋰電池的註冊函式,註冊過程和之前的一樣,在這裡了我就不多講了,講了這麼多主要是講的是函式的註冊過程,通過講解函式的註冊過程讓我們進一步了解核心的管理機制。
君正JZ4775晶元處理器介紹
處理器 central processing unit 核心,配有16kb指令和16kb資料級1快取記憶體,256kb二級快取,工作在1ghz,功能齊全的mmu執行與作業系統相關的任務。cpu核心是xburst處理器引擎。xburst是業界領先的微處理器核心,它提供卓越的高效能和一流的低功耗。此外,...
JZ2440 usb裝置驅動
參考例子 drivers hid usbhid usbmouse.c 功能 插入sub滑鼠列印 滑鼠操作則列印相應的資訊 2016年6月20日22 51 16 include include include include include include static struct input de...
WinCE的電池驅動實現
wince電池驅動的實現 wince6的public目錄下,已經建立了電池驅動的架構,分為mdd層與pdd層,mdd層我們基本不用改動,我們需要修改的部分是pdd層,加入與自己系統硬體相關的部分就可以 為了不發動public下的 我們需要將pdd層的相關 複製到自己的bsp目錄下 如 platfor...