freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于arm的平板電腦的底層硬件驅(qū)動(dòng)設(shè)計(jì)doc-資料下載頁

2025-07-18 01:16本頁面
  

【正文】 struct timed_gpio_data *data = container_of(timer, struct timed_gpio_data, timer)。 gpio_direction_output(datagpio, dataactive_low ? 1 : 0)。 return HRTIMER_NORESTART。}該回調(diào)函數(shù)主要完成一個(gè)功能,根據(jù)active_low來判斷輸出的電平是高電平還是低電平。如果active_low!=0,則輸出高電平。如果active_low==0。當(dāng)整個(gè)驅(qū)動(dòng)加載成功并和設(shè)備相匹配后,會(huì)在sys文件系統(tǒng)下生成/sys/class/timed_output/vibrator/enable這個(gè)節(jié)點(diǎn),用戶空間通過操作這個(gè)節(jié)點(diǎn),就可以達(dá)到操作振動(dòng)電機(jī)的目的。Android中有關(guān)振動(dòng)的HAL層代碼位于:hardware\libhardware_legacy\vibratorhardware\libhardware_legacy\include\vibrator其中,vibrator定義的需要向上層提供的接口如下:int vibrator_on(int timeout_ms)。int vibrator_off()。其中vibrator_on為打開振動(dòng),參數(shù)為振動(dòng)的時(shí)間(毫秒),:int vibrator_on(int timeout_ms){ /* constant on, up to maximum allowed time */ return sendit(timeout_ms)。}int vibrator_off(){ return sendit(0)。} 可見,兩個(gè)函數(shù)最終都會(huì)調(diào)用sendit來執(zhí)行對(duì)硬件的操作。此函數(shù)定義為:static int sendit(int timeout_ms){ int nwr, ret, fd。 char value[20]。ifdef QEMU_HARDWARE if (qemu_check()) { return qemu_control_mand( vibrator:%d, timeout_ms )。 }endif fd = open(THE_DEVICE, O_RDWR)。 if(fd 0) return errno。 nwr = sprintf(value, %d\n, timeout_ms)。 ret = write(fd, value, nwr)。 close(fd)。 return (ret == nwr) ? 0 : 1。}首先,根據(jù)QEMU_HARDWARE宏來判斷當(dāng)前設(shè)備是否是模擬器,如果是則通過qemu_control_mand來執(zhí)行振動(dòng)命令。如果不是,則打開THE_DEVICE宏所定義的設(shè)備文件,其中THE_DEVICE定義為:define THE_DEVICE /sys/class/timed_output/vibrator/enable這樣就可以把HAL層和我們的內(nèi)核驅(qū)動(dòng)相關(guān)聯(lián)。通過write向設(shè)備文件接口中寫入要震動(dòng)的時(shí)間。在內(nèi)核空間最終調(diào)用內(nèi)核驅(qū)動(dòng)程序讓電機(jī)振動(dòng)。第七章 WM8976聲道自動(dòng)切換設(shè)計(jì)及實(shí)現(xiàn)在實(shí)際的產(chǎn)品中,平板電腦輸出的聲道有兩個(gè),一個(gè)是外放喇叭輸出,另一個(gè)是用戶耳機(jī)輸出。一般來說,用戶總是希望在沒有耳機(jī)插入的情況下,打開外放喇叭來聽音。而在用戶插入耳機(jī)后則可以關(guān)閉外放喇叭,聲音只從耳機(jī)發(fā)出來。所以。這就要求產(chǎn)品在設(shè)計(jì)的時(shí)候可以自動(dòng)的進(jìn)行聲道的切換。當(dāng)然,這是一個(gè)軟件和硬件一起配合完成的功能。本設(shè)計(jì)中,音頻codec電路如下:圖71 音頻codec電路采用了wolfson wm8976 作為音頻編解碼器,通過IIS傳遞音頻數(shù)據(jù),并通過IIC總線來配置這顆IC以使其正常工作。為了實(shí)現(xiàn)聲道的切換,在耳機(jī)接口處實(shí)現(xiàn)插拔檢測,電路如下:圖72 耳機(jī)插拔檢測電路利用耳機(jī)座1,2腳的特性,默認(rèn)沒有接耳機(jī)座時(shí),1,2腳是連通的,這時(shí)耳機(jī)檢測中斷接口EAR_DET腳為高電平。一旦有耳機(jī)插入,1,2腳斷開,EAR_DET腳將被拉低,程序?qū)?huì)監(jiān)測到耳機(jī)中斷,通過程序控制,將聲道從喇叭切換到耳機(jī)。反過來,當(dāng)耳機(jī)撥出時(shí),系統(tǒng)會(huì)檢測到耳機(jī)撥出中斷(程序?qū)崟r(shí)切換中斷的電平方式),將聲道從耳機(jī)切換到喇叭。 IOswitch IO 是 Android引進(jìn)的一個(gè)新驅(qū)動(dòng),用于檢測一些開關(guān)量。比如說檢測耳機(jī)的插入和USB設(shè)備插入等。switch IO模塊包含兩個(gè)部分內(nèi)容:首先是switch class,它在Android中是作為一個(gè)module來實(shí)現(xiàn),可以進(jìn)行動(dòng)態(tài)加載。其次是switch class中的一個(gè)具體設(shè)備 switch gpio,它表示針對(duì)gpio的一個(gè)switch設(shè)備,swich gpio也是基于platform device框架實(shí)現(xiàn)。 switch IO 耳機(jī)插拔檢測驅(qū)動(dòng)設(shè)計(jì)及實(shí)現(xiàn)由于switch IO 是以platform device的形式出先,所以要先定義一個(gè)device并注冊(cè)到內(nèi)核中,其platform device定義為:struct platform_device headset_switch_device = { .name = switchgpio, .id = 1, .dev = { .platform_data = amp。headset_switch_data },}。.name確定了設(shè)備的名稱,headset_switch_data :struct gpio_switch_platform_data headset_switch_data ={ .name=GPH0, .gpio=S5PV210_GPH0(5), //GPIO_H05 detect earphone insert action. .state_on=1, .state_off=0, }。結(jié)構(gòu)體中四個(gè)成員分別為:switch IO設(shè)備的名稱,使用到的GPIO,打開狀態(tài)的打印字符,關(guān)閉狀態(tài)的打印字符。通過platform_driver_register(amp。headset_switch_device)。注冊(cè)此設(shè)備到內(nèi)核中。,實(shí)現(xiàn)switch IO的驅(qū)動(dòng)注冊(cè):platform_driver_register(amp。gpio_switch_driver)。其中g(shù)pio_switch_driver的定義如下:static struct platform_driver gpio_switch_driver = { .probe = gpio_switch_probe, .remove = __devexit_p(gpio_switch_remove), .suspend = gpio_switch_suspend, .resume = gpio_switch_resume, .driver = { .name = switchgpio, .owner = THIS_MODULE, },}??梢?,和其他平臺(tái)驅(qū)動(dòng)一樣,實(shí)現(xiàn)了probe,remove,suspend,resume方法,并確定驅(qū)動(dòng)的名稱為switchgpio。這樣一旦此驅(qū)動(dòng)找到與之相匹配的設(shè)備,:static int gpio_switch_probe(struct platform_device *pdev){ struct gpio_switch_platform_data *pdata = pdev。 struct gpio_switch_data *switch_data。 int ret = 0。 if (!pdata) return EBUSY。 switch_data = kzalloc(sizeof(struct gpio_switch_data), GFP_KERNEL)。 if (!switch_data) return ENOMEM。 switch_data = h2w。 switch_datagpio = S5PV210_GPH0(5)。 switch_dataname_on = pdataname_on。 switch_dataname_off = pdataname_off。 switch_datastate_on = 1。 switch_datastate_off = 0。 switch_data = switch_gpio_print_state。 switch_datairq = IRQ_EINT5。 ret = switch_dev_register(amp。switch_datasdev)。 if (ret 0) goto err_switch_dev_register。 ret = gpio_request(S5PV210_GPH0(5), GPH0)。 if (ret 0) goto err_request_gpio。 s3c_gpio_setpull(S5PV210_GPH0(5), S3C_GPIO_PULL_NONE)。 s3c_gpio_cfgpin(S5PV210_GPH0(5), S3C_GPIO_SFN(0xf))。 INIT_WORK(amp。switch_datawork, gpio_switch_work)。 ret = request_irq(switch_datairq, gpio_irq_handler, IRQ_TYPE_EDGE_BOTH, pdevname, switch_data)。 if (ret 0) goto err_request_irq。 /* Perform initial detection */ gpio_switch_work(amp。switch_datawork)。 return 0。err_request_irq:err_detect_irq_num_failed:err_set_gpio_input: gpio_free(switch_datagpio)。err_request_gpio: switch_dev_unregister(amp。switch_datasdev)。err_switch_dev_register: kfree(switch_data)。 return ret。}可見,probe過程主要包含了以下幾個(gè)步驟:1. 獲取gpio數(shù)據(jù)使用權(quán)。2. 設(shè)置gpio方向?yàn)檩斎胫袛郔O。3. 注冊(cè)switch_dev設(shè)備。4. 初始化gpio_switch_work。5. 為gpio分配中斷,并指定中斷服務(wù)程序。6. 讀取gpio初始狀態(tài)。在此過程中我們?yōu)闄z測IO指定了中斷服務(wù)程序,且為雙邊沿出發(fā),所以當(dāng)耳機(jī)插入或者拔出時(shí)都可以觸發(fā)中斷。當(dāng)GPIO觸發(fā)中斷事件時(shí),就會(huì)進(jìn)入中斷服務(wù)程序進(jìn)行處理,其定義如下:static irqreturn_t gpio_irq_handler(int irq, void *dev_id){ struct gpio_switch_data *switch_data = (struct gpio_switch_data *)dev_id。 schedule_work(amp。switch_datawork)。 return IRQ_HANDLED。}該函數(shù)取得gpio_switch_data并執(zhí)行work。這里的work就是我們?cè)诔跏蓟瘯r(shí)指定的gpio_switch_work,其處理如下:static void gpio_switch_work(struct work_struct *work){ int state。 gpio_direction_input(S5PV210_GPH0(5))。 state = gpio_get_value(S5PV210_GPH0(5))。 s3c_gpio_cfgpin(S5PV210_GPH0(5), S3C_GPIO_SFN(0xf))。 wm8976_speaker_on_off_ctl(state)。}此函數(shù)中讀取了耳機(jī)插入中斷檢測IO的電平,并根據(jù)電平的狀態(tài)來確定當(dāng)前耳機(jī)是否為插入狀態(tài)。當(dāng)為高電平時(shí),說明耳機(jī)已經(jīng)拔出,則打開wm8976外放喇叭。當(dāng)為低電平時(shí),說明耳朵已經(jīng)插入,則關(guān)閉外放喇叭。 wm8976聲道切換控制實(shí)現(xiàn)對(duì)wm8976的控制采用IIC總線來傳輸數(shù)據(jù),,其時(shí)序如下圖:圖73 IIC總線通信時(shí)序I2C總線是由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。I2C總線在傳送數(shù)據(jù)過程中有以下3種類型信號(hào):(a) 開始信號(hào)(Start)。SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。(b)結(jié)束信號(hào)(Stop)。SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。(c)應(yīng)答信號(hào)(Ack)。接收數(shù)據(jù)的IC在接收到8 bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。I2C總線在傳送數(shù)據(jù)時(shí),必須保證在SCL高電平時(shí)SDA上數(shù)據(jù)穩(wěn)定,否則就判斷為開始或結(jié)束信號(hào)。 為了關(guān)閉喇叭輸出,配置wm8976 R54和R55寄存器,其中R54位定義如下:圖74 wm8976 R54寄存器位描述R55類似。可以看出,R54 bit6就決定了喇叭輸出是否靜音,該位為0時(shí),執(zhí)行普通操作,為1時(shí)可讓外放喇叭靜音。所以wm8976_speaker_on_off_ct
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1