版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 - 3 - 頁(yè) 共 31 頁(yè)目錄A80T錯(cuò)誤!未定義書簽。G-sensor 開發(fā)說(shuō)明書.- 1 -1. 前言.- 5 -1.1. 編寫目的.- 5 -1.2. 適用范圍.- 5 -1.3. 相關(guān).- 5 -2 模塊介紹.- 6 -2.1.模塊功能介紹.- 6 -2.2.硬件介紹.- 6 -2.3.源碼結(jié)構(gòu)介紹.- 6 -2.4.模塊配置介紹.- 7 -2.4.1. sys_config fex 配置 .- 7 -2.4.2.config 的配置.- 8 -3.模塊體系結(jié)構(gòu)描述.- 12 -4.模塊數(shù)據(jù)結(jié)構(gòu)描述.- 13 -4.1.struct i2c_driver bma250_drive
2、r.- 13 -4.2.struct bma250_data.- 13 -4.3.struct bma250acc .- 14 -4.4.strucsor_config_info.- 14 -5.模塊移植 demo.- 15 -5.1. G-sensor 驅(qū)動(dòng)概述.- 15 -5.2. G-sensor 移植.- 15 -5.2.1.驅(qū)動(dòng)中 INPUT 子系統(tǒng)關(guān)鍵接口.- 15 -5.2.2. I2C 設(shè)備關(guān)鍵接口.- 15 -5.2.3.設(shè)備驅(qū)動(dòng)關(guān)鍵變量.- 16 -5.2.4.需要包含的頭文件.- 16 -5.2.5. I2C 地址 .- 16 -5.2.6. detect 函數(shù).- 16
3、 -5.2.7.G-sensor 驅(qū)動(dòng) init 函數(shù).- 18 -5.2.8. super standby 支持.- 19 -5.2.9.模塊加載及 resume 延時(shí)優(yōu)化 .- 21 -5.2.10.模塊 remove 函數(shù) check .- 22 -5.2.11.Sysfs 接口.- 22 -5.2.12.Kconfig 和Makefile 文件.- 23 -5.2.12.驅(qū)動(dòng)調(diào)試信息.- 23 -6.G-sensor Android 層配置.- 25 -6.1 方向的配置.- 25 -6.2 驅(qū)動(dòng)的加載.- 26 -7.模塊調(diào)試.- 27 -7.1 調(diào)試信息的使用方法.- 27 -7.
4、2 gsensor 驅(qū)動(dòng)調(diào)試步驟.- 27 -7.3. G-sensor 測(cè)試.- 30 -第 - 4 - 頁(yè) 共 31 頁(yè)8.Declaration.- 31 -第 - 5 - 頁(yè) 共 31 頁(yè)前言編寫目的文檔對(duì) G-sensor 硬件以及軟件相關(guān)的調(diào)試與移植過(guò)程作詳細(xì)的講解,同時(shí)對(duì)G-sensor 的使用與測(cè)試作簡(jiǎn)要的講解,為達(dá)到能快速移植驅(qū)動(dòng)與使用 G-sensor 的目的。1.2. 適用范圍介紹本模塊設(shè)計(jì)適用 A80T。1.3. 相關(guān)項(xiàng)目中G-sensor 驅(qū)動(dòng)的開發(fā),以及使用應(yīng)認(rèn)真閱讀該文檔。模塊介紹模塊功能介紹在人機(jī)交互過(guò)程中,G-sensor 起著非常重要的作用,gsensor
5、作為輸入設(shè)備,能感知當(dāng)前G-sensor 傳感器所處的空間狀態(tài),附著在 pad 上配合使用,能測(cè)量出 pad 在空間上的坐標(biāo)狀態(tài),從而獲知 pad 用戶的操作意圖:橫豎屏切換,轉(zhuǎn)彎等。2.2.硬件介紹目前 G-sensor 與 HOST 的連接有 4 個(gè) pin 腳,分別為 VCC,GND,SDA,SCL。引腳正常工作時(shí)候的高電平均為 3.3V。圖 1 G-sensor 硬件連接圖G-sensor 的調(diào)試中,首先確認(rèn)硬件的正確性。硬件調(diào)試中,需要確認(rèn)下列項(xiàng):、確認(rèn)各個(gè)引腳與 HOST 連接的正確性。電源電壓是不是正常的,VCC 是否為 3.3V,GND 是否為 0。 I2C 引腳電平是否匹配。
6、確認(rèn)設(shè)備使用的 I2C 地址,特別是設(shè)備可以設(shè)置為多個(gè)地址時(shí)。2.3.源碼結(jié)構(gòu)介紹G-sensor 驅(qū)動(dòng)源碼位于如下兩個(gè)目錄中。mma7660,mma8452,mma865x,afa750,kxtik 的源碼位于linux-3.4drivershwmon中。bma250,lis3de,lis3dh,dmard10,mxc622x 的源碼位于 linux-3.4driversgsensor 中。linux-3.4 drivers/hwmon/ mma7660.c mma8452.c mma865x.c afa750.c kxtik.cHOSTsensorcontrollllerI2C BUS第
7、- 7 - 頁(yè) 共 31 頁(yè)drivers/G-sensor/ bma250.c lis3de_acc.c lis3dh acc.c dmard10.c mxc622x.c2.4.模塊配置介紹2.4.1. sys_config.fex 配置(1)Gsensor 使用配置配置文件的位置:licheetoolspackchipn9iw1configs目錄下。配置文件 sys_config.fex 中關(guān)于G-sensor 的配置項(xiàng)如下:G sensor configurationgs twi id -TWI ID for controlling G-sensor (0: TWI0, 1: TWI1,
8、 2: TWI2)G-sensor paraG-sensor G-sensor G-sensorG-sensor_used twi id12= 1= 2=文件配置說(shuō)明如下:目前G-sensor 采用輪詢工作方式,在 sysconfig 中只需指定如下兩個(gè)信息即可:G-sensor_used 設(shè)為 1,代表啟用 G-sensor;G-sensor_twi_id 根據(jù)具體的電路,選擇對(duì)應(yīng)的 I2C;(2)gsensor 自動(dòng)檢測(cè)配置使用自動(dòng)檢測(cè)功能時(shí),需要增加以下配置信息,增加設(shè)備的可選擇性。如果gsensor_used 設(shè)置為0 則將退出gsensor的自動(dòng)檢測(cè)。;配置項(xiàng)配置項(xiàng)含義G-senso
9、r_used=xx是否支持G-sensorG-sensor_twi_id =xxI2C的 BUS控 制 選 擇 , 0 :TWI0;1:TWI1;2:TWI2G-sensor_1xx中斷 1 的GPIO 配置,目前暫不使用G-sensor_2=xx中斷 2 的GPIO 配置,目前暫不使用第 - 8 - 頁(yè) 共 31 頁(yè); G sensor automatic detection configuration;gsensor detect;Module name;usedt- Whether startup automatic inspection function. 1:used,0:unuse
10、dition 1 said detection, 0 means no detection.-gsensor_list_para gsensor_det_used bma250mma8452 mma7660 mma865x afa750 lis3de_acc lis3dh acc Kxtik dmard10 dmard06 mxc622x fxos8700lsm303d= 1 /設(shè)置為 1 時(shí),啟動(dòng)自動(dòng)檢測(cè),設(shè)置為 0 時(shí),退出自動(dòng)檢測(cè)。= 1 /設(shè)置為 1,該模塊支持的 I2C 地址添加到掃描列表= 1= 1= 1= 1= 1= 1= 1= 0 /設(shè)置為 0,該模塊支持的 I2C 地址從掃描
11、列表中剔除= 1= 1= 0= 0當(dāng)gsensor_det_used 設(shè)置為 1 時(shí),啟用自動(dòng)檢測(cè),將設(shè)置為 0 時(shí),退出自動(dòng)檢測(cè)。模塊的名稱后面寫 1 表示添加到自動(dòng)檢測(cè)掃描列表,寫 0 表示剔除自動(dòng)檢測(cè)掃描列表。gsensor_list_para 列表中的名稱順序必須與 sw_device.c 中 gsensors 的名稱順序一一對(duì)應(yīng)。2.4.2.config 的配置對(duì)于G-sensor 的的內(nèi)核配置,可通過(guò)命令 make ARCH=arm界面,并按以下步驟操作:首先,選擇Device Drivers 選項(xiàng)進(jìn)入下一級(jí)配置,如圖 2 所示:config 進(jìn)入配置主第 - 9 - 頁(yè) 共 31
12、 頁(yè)圖 2 :Device Drivers 選項(xiàng)配置進(jìn)入Device Drivers 配置后,如果需要配置 mma7660,mma8452,mma865x,afa750等,選擇Hardware Monitoring support,如圖 3 所示:圖 3 :Hardware Monitoring support 選項(xiàng)配置Hardware Monitoring support 選項(xiàng)配置下的驅(qū)動(dòng)如下圖所示:第 - 10 - 頁(yè) 共 31 頁(yè)圖 4 :Hardware Monitoring support設(shè)備驅(qū)動(dòng)進(jìn)入Device Drivers 配置后,如果需要配置 bma250,lis3de,li
13、s3dh 等,選擇 G-sensor support,如圖 5 所示:圖 5 :I2C G-sensor support 選項(xiàng)配置最后,選擇相應(yīng)的 G-sensor 模塊驅(qū)動(dòng)選項(xiàng),可選擇直接編譯進(jìn)內(nèi)核,也可以選擇編譯成模塊。如圖 6 所示:第 - 11 - 頁(yè) 共 31 頁(yè)圖 6 G-sensor 驅(qū)動(dòng)模塊選項(xiàng)配置第 - 12 - 頁(yè)共 31 頁(yè)3.模塊體系結(jié)構(gòu)描述G-sensor 模塊的體系結(jié)構(gòu)圖,如圖 6 所示。/dev/input/eventX/dev/input/misc/dev/iinnput/jsUser spaceKernel spaceIInporeIInnpput EEvve
14、nt DriiveersGsensor driverI2C ddriverrI2C BUSI2C控制器Hardware圖 6:G-sensor 模塊體系結(jié)構(gòu)圖G-sensor 設(shè)備為使用 I2C 總線進(jìn)行通信的輸入設(shè)備,G-sensor driver 通過(guò)調(diào)用 I2C驅(qū)動(dòng)的相應(yīng)接口來(lái)實(shí)現(xiàn)對(duì) G-sensor 設(shè)備的控制、通信,如 G-sensor driver 對(duì)G-sensor 設(shè)備硬件各寄存器的讀寫等。G-sensor driver 將底層硬件對(duì)用戶輸入的響應(yīng)轉(zhuǎn)換為標(biāo)準(zhǔn)的輸入事件,再通過(guò)層對(duì)下提供了 G-sensor driver 的編程接層(Inpore)提交給事件處理層;而口,對(duì)上又提
15、供了事件處理層的編程接口;而事件處理層(input Event Driver)就為我們用戶空間的應(yīng)用程序提供了 間將根據(jù)設(shè)備的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)的設(shè)備的接口和驅(qū)動(dòng)層提交來(lái)的事件處理。用戶空以及相應(yīng)的處理。Gsensor設(shè)備第 - 13 - 頁(yè)共 31 頁(yè)模塊數(shù)據(jù)結(jié)構(gòu)描述struct i2c_driver bma250_driverbma250_driver:該變量會(huì)到 i2c_driver 中, 為匹配設(shè)備名,probe為設(shè)備的偵測(cè)函數(shù),address_list 為 I2C 的 scan 地址,suspend的休眠喚醒函數(shù)。sic struct i2c driver bma25
16、0 driver = .class = I2C_CLASS_HWMON,.driver = .owner = THIS_MODULE,與 resume 為進(jìn)內(nèi)核.name= SENSOR NAME,.id table= bma250 id,.probe.remove= bma250_probe,= bma250 remove,#ifdef CONFIG_HAS_EARLYSUSPEND#else#ifdef CONFIG_PM.suspend = bma250_suspend,.resume = bma250_resume, #endif#endif.address_list = normal
17、_i2c,;4.2.struct bma250_datastruct bma250_data :代表了G-sensor 驅(qū)動(dòng)所需要的信息的集合,用于幫助實(shí)現(xiàn)對(duì)采樣信息的處理。struct bma250_data struct i2c_cnt *bma250_cnt; atomic_t delay;atomic_t enable; unsigned char mode;struct input_dev *input;第 - 14 - 頁(yè)共 31 頁(yè)struct bma250acc value; struct mutex value mutex; struct mutex enable_mutex
18、; struct mutex mode mutex; struct delayed_work work; struct work struct irq work;#ifdef CONFIG_HAS_EARLYSUSPENDstruct early suspend early suspend; unsigned char range_se; unsigned char bandwidth se;#endif;4.3.struct bma250accstruct bma250acc 用于struct bma250acc s16 x,y,z; ;采樣時(shí)獲得的 x 軸,y 軸,z 軸的坐標(biāo)信息。4.4
19、.strucstrucsor_config_infosor_config_info 用于到的 sysconfig.fex 中g(shù)sensor 的相關(guān)信息。input_type 為 gsensor 設(shè)備的類型,gsensor 使用GSENSOR_TYPE。 sensor_used 為 sysconfig.fex 中的 gsensor_used 值。twi_id 為 sysconfig.fex 中的 gsensor_twi_id 值。strucsor config infoenum inpusor type input type;sensor used;u32 twi id;第 - 15 - 頁(yè)共
20、31 頁(yè)模塊移植 demoG-sensor 驅(qū)動(dòng)概述G-sensor 驅(qū)動(dòng)作為硬件與軟件的一個(gè)橋梁,實(shí)現(xiàn)對(duì) G-sensor 控制器硬件初始化,獲取G-sensor 控制器到的位置坐標(biāo)信息(必要時(shí),對(duì)數(shù)據(jù)進(jìn)行濾波和用戶操作意圖識(shí)別),上報(bào)用戶操作相關(guān)信息于操作系統(tǒng),經(jīng)上層系統(tǒng)處理后,正確響應(yīng)用戶的意圖。G-sensor 驅(qū)動(dòng)在系統(tǒng)中必須滿足如下要求:接口:G-sensor 驅(qū)動(dòng),不應(yīng)自行決定是否上報(bào),上報(bào)頻率等,應(yīng)提供接口,供上層應(yīng)用控制驅(qū)動(dòng)的運(yùn)行和數(shù)據(jù)上報(bào):包括使能控制 Enable, 上報(bào)時(shí)延 delay 等;通常通過(guò) sys 文件系統(tǒng)提供,這部分實(shí)現(xiàn),遵循標(biāo)準(zhǔn)的 linux 規(guī)范;上報(bào)數(shù)
21、據(jù)的方式:或者提供接口供上層(eg: ioctl),或者掛接在 input 系統(tǒng)子系統(tǒng)上,使用 input 系統(tǒng)子系統(tǒng)的接口,供上層使用(eg: inpore)。5.2. G-sensor 移植驅(qū)動(dòng)的移植中主要需要關(guān)注點(diǎn)為如何獲取sys_config.fex 中的配置信息,detect 函數(shù), suspend 以及 resume 函數(shù)等。以下將以 bma250 系列驅(qū)動(dòng)移植過(guò)程為例進(jìn)行說(shuō)明。源碼路徑為:licheelinux-3.4driversG-sensorbma250.c5.2.1.驅(qū)動(dòng)中 INPUT 子系統(tǒng)關(guān)鍵接口這部分接口是 linux INPUT 子系統(tǒng)對(duì)外提供的接口,G-sens
22、or driver 使用這些接口,向input 子系統(tǒng)設(shè)備和上報(bào)數(shù)據(jù)。(1)申請(qǐng)input_dev 結(jié)構(gòu):struct input_dev *input_allocate_device(void)(2)輸入設(shè)備,并和對(duì)應(yīng)的 handler 處理函數(shù)掛鉤:input_register_devitruct input_dev *dev)(3)注銷Input 設(shè)備:input_unregister_devitruct input_dev *dev)上報(bào)坐標(biāo)值(絕對(duì)值):sic inline void input_report_abs(struct input_dev *dev, unsigned v
23、alue)上報(bào)坐標(biāo)結(jié)束時(shí)同步信號(hào):sic inline void input_sync(struct input_dev *dev)code,5.2.2. I2C 設(shè)備關(guān)鍵接口目前G-sensor 設(shè)備驅(qū)動(dòng)使用的都是 I2C 總線進(jìn)行通信,關(guān)鍵的接口如下所示:第 - 16 - 頁(yè)共 31 頁(yè)i2c_set_cntdata將設(shè)備驅(qū)動(dòng)的私有數(shù)據(jù)連接到設(shè)備 cnt 中。i2c_get_cntdata獲取設(shè)備cnt 的設(shè)備驅(qū)動(dòng)的私有數(shù)據(jù)。i2c_add_driver通過(guò) I2C的 i2c_add_driver()函數(shù)添加 i2c_driver,使用到的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)為i2c_driver,注意i2c_d
24、river 中使用的 name 需與 INPUT 中的 input_dev name 一致,否則有會(huì)出現(xiàn)找不到設(shè)備的情況。在 bma250.c 驅(qū)動(dòng)中的 i2c_driver 變量為 bma250_driver,其具體定義在 4.1 節(jié)中已經(jīng)給出。(4)i2c_del_driver通過(guò) I2C的i2c_del_driver()函數(shù)刪除 i2c_driver。(5)sysfs_create_groupsysfs 接口,使用如下格式進(jìn)行創(chuàng)建:sysfs_create_group(&pdev-dev.kobj, &dev_attr_grp);5.2.3.設(shè)備驅(qū)動(dòng)關(guān)鍵變量移植新的設(shè)備驅(qū)動(dòng)時(shí),需要設(shè)置一
25、些跟相關(guān)的關(guān)鍵的變量,如表所示:5.2.4.需要包含的頭文件Gsensor 驅(qū)動(dòng)中需要包含頭文件:#include 這個(gè)頭文件中包含使用的 struc相關(guān)調(diào)用接口與打印等級(jí)的定義。sor_config_info 結(jié)構(gòu)體以及sysconfig.fex 的該文件的具體實(shí)現(xiàn):licheelinux-3.4driversinputsw_device.c5.2.5. I2C 地址在G-sensor 驅(qū)動(dòng)中 I2C 地址有四個(gè),均放置在掃描地址數(shù)組normal_i2c。 normal_i2c 地址以固定的形式存在于設(shè)備驅(qū)動(dòng)中。存放設(shè)備地址的數(shù)組必須以I2C_CNT_END 標(biāo)致結(jié)束。如下所示:sic co
26、nst unsigned short normal_i2c = 0 x18,0 x19,0 x38,0 x08,I2C_CNT_END;5.2.6. detect 函數(shù)名稱含義使用位置debug_mask設(shè)置打印等級(jí)變量在 module_para_name 中使用normal_i2cI2C 總線掃描地址數(shù)組i2c_driver 結(jié)構(gòu)體中,設(shè)備地址i2c_addressI2C 總線detect 函數(shù)掃描地址數(shù)組gsensor_detect 函數(shù)掃描地址第 - 17 - 頁(yè)共 31 頁(yè)G-sensor 驅(qū)動(dòng)中的 gsensor_detect 函數(shù)實(shí)現(xiàn)硬件檢測(cè)功能,它會(huì)遍歷此驅(qū)動(dòng)支持所的 I2C 地
27、址,如果某個(gè) I2C 地址能夠正常通信并讀到了正確的 chip_id,則 dectect有成功,繼續(xù)加載驅(qū)動(dòng)。否則此驅(qū)動(dòng)支持的沒(méi)有在電路中,驅(qū)動(dòng)模塊加載失敗。bma_250 的detect 函數(shù)如下。sicgsensor detect(struct i2c cnt *cnt, struct i2c board info *info)struct i2c_adapter *adapter = cnt-adapter; ret , i = 0 ,retry = 2;if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA) ret
28、urn -ENODEV;if (twi_id = adapter-nr) while(retry-) for(i2c_num=0;i2c_numaddr = i2c_addressi2c_num;ret = i2c_smbus_read_byte_dnt,BMA250_CHIP_ID_REG);dprk(DEBUG_INIT, %s:addr= 0 x%x, i2c_num:%d, ReadIDvalueis :%dn,_func_, cnt-addr, i2c_num, ret); while(chip_id_valuei+) & (i type, SENSOR_NAME, I2C_NAME
29、_SIZE); return 0;dprk(DEBUG_INIT, %s:ch Sensortec Device not found,maybe the other gsensor equipment! n,_func_); return -ENODEV; else return -ENODEV;第 - 18 - 頁(yè)共 31 頁(yè)i2c_address 數(shù)組了此驅(qū)動(dòng)支持的所有的I2C 地址,對(duì)每個(gè)I2C 地址chip_id,如果成功,且為驅(qū)動(dòng)支持的 chip_id,則 detect 成功。如果設(shè)備沒(méi)有 chi detect 為例子如下所示:的可以進(jìn)行 i2c 檢測(cè)設(shè)備是否存在。如下所示:以 mm
30、a7660.c desicgsensor_detect(struct i2c_cnt *cnt, struct i2c_board_info *info)struct i2c_adapter *adapter = cnt-adapter; ret;if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA) return -ENODEV;if(config_info.twi_id = adapter-nr)dprk(DEBUG_INIT, %s: addr= %xn,_func_,cnt-addr);ret = gsensor_
31、i2c_test(cif(!ret)nt);dprk(DEBUG_INIT, %s:I2C connection might be something wrong ormaybe the other gsensor equipment! n,_func_);return -ENODEV;elsestrlcpy(info-type, SENSOR NAME, I2C NAME SIZE); return 0;elsereturn -ENODEV;5.2.7.G-sensor 驅(qū)動(dòng) init 函數(shù)該函數(shù)中主要任務(wù)為調(diào)用 input_fetch_sysconfig_para 函數(shù)獲取 sys_con
32、fig.fex 中的配置信息;接著將 gsensor_detect 函數(shù)賦值給 i2c_driver,調(diào)用接口下所示:sic_init BMA250_init(void)ret = -1;i2c 設(shè)備驅(qū)動(dòng)。如dprk(DEBUG_INIT, bma250: initn);第 - 19 - 頁(yè)共 31 頁(yè)if(input fetch sysconfig para(&(config info.input type)prk(%s: err.n,func);return -1;if(config_info.sensor_used = 0)prprk(* used set to 0 !n);k(* if
33、 use sensor,please put the sys_config.fex gsensor_used set to 1. n);return 0;bma250 driver.detect = gsensor detect; ret = i2c add driver(&bma250 driver);return ret;5.2.8. super standby 支持(1)super standby 中 suspend 以及 resume 的處理super standby 就是關(guān)掉除 AVCC 和DRAM_VCC 電源以外的所有電源,因此在休眠時(shí)gsensor 會(huì)被斷電,在 resume
34、時(shí),需要重新初始化 gsensor 的一些寄存器。以 bma250 為例,其 suspend 函數(shù)及 resume 函數(shù)如下。在 suspend 時(shí)判斷休眠類型是否為 super standby,如果是,則保存當(dāng)前 gsensor 的一些寄存器信息。在 resume 時(shí),判斷是否為 super standby,如果是,則將 suspend 時(shí)保存的寄存器信息重新寫入 gsensor。sic void bma250_early_suspend(struct early_suspend *h)struct bma250_data *data = container_of(h, struct bma
35、250_data, early_suspend);dprk(DEBUG SUSPEND, bma250: early suspendn);if (NORMAL_STANDBY = standby_type) else if (SUPER STANDBY = standby type) if (bma250 get bandwidth(data-bma250 cnt, &data-bandwidth se) bma250 cnt, &data-range se) bma250 cnt,data-bandwidth se) bma250 cnt, data-range se) input-clos
36、e(struct input_dev *dev)將設(shè)備關(guān)閉,否則將可以導(dǎo)致設(shè)備無(wú)法進(jìn)入休眠。以 mma8452 為例子進(jìn)行說(shuō)明。字體加粗部分即為打開與關(guān)閉輪詢延時(shí)工作隊(duì)列的函數(shù)調(diào)用。sic void mma8452_early_suspend(struct early_suspend *h) mutex_lock(&enable_mutex); atomic_set(&mma8452_suspend_id, 1);mma8452 idev-input-close(mma8452 idev-input);mutex_unlock(&enable_mutex);sic void mma8452_l
37、ate_resume(struct early_suspend *h) /(struct i2c_cnt *cnt)第 - 21 - 頁(yè)共 31 頁(yè) mutex_lock(&enable_mutex);atomic set(&mma8452 suspend id, 0);mma8452_idev-input-open(mma8452_idev-input);mutex unlock(&enable mutex);5.2.9.模塊加載及 resume 延時(shí)優(yōu)化有些G-sensor 在初始化時(shí),初始化寄存器后,需要一定的延時(shí)才能正常工作。一般這個(gè)延時(shí)都是忙等待,這樣在加載驅(qū)動(dòng)及 super sta
38、ndby 喚醒時(shí),相當(dāng)耗時(shí),影響用戶體驗(yàn)?,F(xiàn)在進(jìn)行了優(yōu)化。思路是采用工作隊(duì)列線程將寄存器初始化部分單獨(dú)延后執(zhí)行,不影響主進(jìn)程的運(yùn)行。以 mma8452 為例,它在初始化寄存器時(shí)有一個(gè) 100ms 的延時(shí)。因此,在其休眠喚醒時(shí)的 resume 函數(shù)中進(jìn)行了相應(yīng)的優(yōu)化,其源碼如下,在休眠喚醒時(shí) resume 函數(shù)如下。sic void mma8452 late resume(struct early suspend *h) /(struct i2c cnt *cnt)result;dprk(DEBUG SUSPEND, mma8452 late resume);if (NORMAL STANDBY
39、 = standby type) else if (SUPER STANDBY = standby type) queue_work(mma8452_resume_wq, &mma8452_resume_work);dprk(DEBUG SUSPEND, mma8452 late resume end);return ;字體加黑的部分為啟動(dòng)工作隊(duì)列線程來(lái)將 mma8452 的寄存器初始化延后執(zhí)行。mma8452_resume_work 對(duì)應(yīng)的執(zhí)行函數(shù)為 mma8452_resume_events,其源碼如下。 sic void mma8452_resume_events (struct wor
40、k_struct *work)第 - 22 - 頁(yè) 共 31 頁(yè)mma8452 init cnt(mma8452 i2c cnt);mma8452_init_cnt 為初始化 mma8452 寄存器函數(shù),其中有一個(gè) 100ms 的忙等待延時(shí)。這部分的總體實(shí)現(xiàn)請(qǐng)參考 mma8452.c 源碼。5.2.10.模塊 remove 函數(shù) check模塊卸載時(shí),注意 probe 函數(shù)與 init 函數(shù)中申請(qǐng)的資源,要依照申請(qǐng)的順序進(jìn)行釋放,后申請(qǐng)的先。如果申請(qǐng)的資源沒(méi)有,或沒(méi)有按照順序,在模塊卸載時(shí),會(huì)卸載失敗,甚至導(dǎo)致死機(jī)。同時(shí),在卸載時(shí),注意要調(diào)用 i2c_set_cntdnt, NULL);函數(shù)。
41、否則驅(qū)動(dòng)自己是可以正常卸載的,但卸載后,向此 I2C 加載其它 gsensor 驅(qū)動(dòng)時(shí)會(huì)出現(xiàn) I2C 通訊不成功問(wèn)題。5.2.11.Sysfs 接口Gsensor 驅(qū)動(dòng)中,需要提供使能控制以及上報(bào)時(shí)延等基本接口,通常通過(guò) sysfs 文件系統(tǒng)提供,sensors 的驅(qū)動(dòng)中,使能控制命名為 enable,上報(bào)時(shí)延為 delay,如果名字變換,將可能造成 hal 層將無(wú)法向驅(qū)動(dòng)層中寫入使能控制以及時(shí)延,造成設(shè)備不工作或者是數(shù)據(jù)上報(bào)慢,影響體驗(yàn)效果。(1)函數(shù)宏 DEVICE_ATTRDEVICE_ATTR宏有四個(gè)參數(shù),分別是名稱、權(quán)限位、讀函數(shù)、寫函數(shù)。其中讀函數(shù)和寫函數(shù)是讀寫功能函數(shù)的函數(shù)名。需
42、要 的使能控制的名稱應(yīng)該設(shè)置為 enable;上報(bào)時(shí)延的名稱應(yīng)該設(shè)置為 delay。基本函數(shù)為 enable 以及 delay,如需要進(jìn)行相關(guān)的調(diào)試,可以增加其他的接口。如下所示:.sic DEVICE ATTR(delay, S IRUGO|S IWUSR|S IWGRP,bma250 delay show, bma250 delay);sic DEVICE ATTR(enable, S IRUGO|S IWUSR|S IWGRP,bma250 enable show, bma250 enable);.(2)attribute 結(jié)構(gòu)體的填充將DEVICE_ATTR的接口填充到 attribu
43、te 結(jié)構(gòu)體中,如下所示:sic struc.tribute *bma250_attributes = &dev_attr_delay.attr,&dev attr enable.attr, NULL第 - 23 - 頁(yè)共 31 頁(yè);該結(jié)構(gòu)體必須以 NULL 結(jié)束。(3)attribute_group 結(jié)構(gòu)體的填充完成了attribute 結(jié)構(gòu)體的填充后,將實(shí)現(xiàn) attribute_group 結(jié)構(gòu)體的填充,如下所示:sic structribute group bma250 attribute group = .attrs = bma250 attributes;(4)sysfs 接口的調(diào)用
44、系統(tǒng)提供函數(shù),進(jìn)行,如下:err = sysfs_create_group(&data-input-dev.kobj,&bma250_attribute_group);5.2.12.Kconfig 和 Makefile 文件添加一個(gè)新的 G-sensor 驅(qū)動(dòng)需要修改 Kconfig 文件和 Makefile 文件以使得能夠在config 中選中 G-sensor 驅(qū)動(dòng)并編譯生成模塊或者是直接編譯進(jìn)內(nèi)核?,F(xiàn) bma250.c為例,將源碼拷貝到目錄: .exdroidlicheelinux-3.4driversgsensor 下,按照文件 Kconfig與Makefile 的形式,將 G-sen
45、sor 的驅(qū)動(dòng)Kconfig 文件:config SENSORS_BMA250trise BMA250 acceleration sensor support depends on I2Chelp進(jìn)去,如下:If you say yes here you get support foracceleration sensors BMA250 Makefile 文件:ch Sensortecsobj-$(CONFIG_SENSORS_BMA250)+= bma250.o兩個(gè)文件中設(shè)置的名字必須一致,即“CONFIG_SENSORS_BMA250”需一致,編譯之后會(huì)自動(dòng)的生成.Ko 文件。添加之后可
46、以到系統(tǒng)中查看是否添加成功,在編譯服務(wù)器上,目錄為 workspaceexdroidlicheelinux-3.4 上,輸入命令:make ARCH=armconfig進(jìn)入目錄Device Driversgsensor support 即可看到添加的驅(qū)動(dòng)。5.2.12.驅(qū)動(dòng)調(diào)試信息為了實(shí)現(xiàn)動(dòng)態(tài)開關(guān)打印信息,在 input 子系統(tǒng)的驅(qū)動(dòng)模塊中加入一個(gè)模塊參數(shù)debug_mask。驅(qū)動(dòng)中所有的打印 prk 前加一個(gè) if 條件判斷語(yǔ)句,進(jìn)行打印等級(jí)與debug_mask 的按位與,debug_mask 相應(yīng)等級(jí)位為真(1),則打印此 pr則關(guān)閉此打印。在G-sensor 代碼 bma250.c 中
47、,打印消息設(shè)置如下。k,為假(0)第 - 24 - 頁(yè)共 31 頁(yè)在文件開頭,首先定義打印等級(jí),模塊參數(shù),及打印函數(shù),示例代碼如下:sic u32 debug_mask = 0;#define dprk(level mask, fmt, arg.)if (unlikely(debug mask & level mask) prk(KERN_DEBUG fmt , # arg)module_param_named(debug_mask, debug_mask, S_IRUGO | S_IWUSR | S_IWGRP);如代碼中所示,枚舉定義了打印等級(jí),每一個(gè)等級(jí)占用一位。debug_mask 為
48、控制打印的模塊參數(shù),默認(rèn)為 0,關(guān)閉所有的打印。dprk 函數(shù)為封裝好的打印函數(shù),在驅(qū)動(dòng)中調(diào)用它來(lái)打印相關(guān)的調(diào)試信息,如下面代碼中所示。sic void bma250 early suspend(struct early suspend *h)struct bma250 data *data =container_of(h, struct bma250_data, early_suspend);dprk(DEBUG_SUSPEND, bma250: early suspendn);在 bma250_early_suspend 函數(shù)中調(diào)用 dprk 函數(shù)打印調(diào)試信息,打印等級(jí)設(shè)為DEBUG_SU
49、SPEND。當(dāng) debug_mask 的第 3 位為 1,則此條打印消息會(huì)成功打?。划?dāng)debug_mask 的第 3 位為 0,則此打印消息。在具體的驅(qū)動(dòng)調(diào)試中,如果驅(qū)動(dòng)編譯成模塊,則在驅(qū)動(dòng)加載時(shí),設(shè)置 debug_mask的值,從而實(shí)現(xiàn)對(duì)各級(jí)打印消息的開關(guān)控制。insmod /system/vendor/modules/bma250.ko debug_mask=0 x0b此方法存在的問(wèn)題:當(dāng)驅(qū)動(dòng)加載不成功時(shí),沒(méi)有模塊參數(shù)文件節(jié)點(diǎn)來(lái)讓修改debug_mask 的值,為了避免這個(gè)不足,在初始化函數(shù) init 及 probe 函數(shù)中的初始化 fail的相關(guān)打印最好寫成 prk 直接打印,這些 pr
50、k 在模塊正常工作時(shí)是不會(huì)被打印的,只有模塊加載失敗時(shí)才會(huì)被打印出來(lái)。第 - 25 - 頁(yè)共 31 頁(yè)6.G-sensor Android 層配置添加 G-sensor驅(qū)動(dòng)模塊對(duì)應(yīng) 的 hal層。 G-sensor的 hal層源碼為 androiddevioftwinnermonhardwarelibhardwarelibsensors目錄下的。6.1 方向的配置同時(shí),在 androiddevi下幾個(gè)變量。oftwinnerkylin-目錄下有個(gè) gsensor.cfg 文件,了如因?yàn)樽罱K產(chǎn)品電路設(shè)計(jì)可能不一樣,導(dǎo)致 G-sensor 可能貼的方向不一樣,所以會(huì)出現(xiàn)添加G-sensor 后,用
51、戶實(shí)際使用中會(huì)出現(xiàn) G-sensor 方向不對(duì)的現(xiàn)象。需要根據(jù)以下步驟進(jìn)行方向的調(diào)試。Gsensor 方向調(diào)試說(shuō)明:假定機(jī)器的長(zhǎng)軸為 X 軸,短軸為 Y 軸,垂直方向?yàn)?Z 軸。首先調(diào)試Z 軸:第一步觀察現(xiàn)象:旋轉(zhuǎn)機(jī)器,發(fā)現(xiàn)當(dāng)只有垂直 90時(shí)或者是在旋轉(zhuǎn)后需要抖動(dòng)一下,方向才會(huì)發(fā)生變化,則說(shuō)明 Z 軸反了。若當(dāng)機(jī)器大概 45拿著的時(shí)候也可以旋轉(zhuǎn),說(shuō)明 Z 軸方向正確。無(wú)需修改Z 軸方向。第二步修改 Z 軸為正確方向。此時(shí)需要找到當(dāng)前使用模組的方向向量(根據(jù)模組的名稱)。如果此時(shí)該方向 Z 軸向量(gsnesor_direct_z)的值為 false,則需要修改為 true;當(dāng)為 true,則需
52、要修改為 false。通過(guò) adb s觀察現(xiàn)象。將修改后的 gsnesor.cfg 文件 push 到 system/usr 下,重啟機(jī)器,按第一步其次查看 X,Y 軸是否互換:第一步觀察現(xiàn)象:首先假定長(zhǎng)軸為 X 軸,短軸為 Y 軸,以 X 軸為底邊將機(jī)器立起來(lái)。查看機(jī)器的 X, Y 方向是否正好互換,若此時(shí)機(jī)器的 X,Y 方向正好互換,在說(shuō)明需要將 X,Y 方向交換。若此時(shí) X,Y 方向沒(méi)有反置,則進(jìn)入 X,Y 方向的調(diào)試。gsensor_nameG-sensor 名稱,必須與驅(qū)動(dòng)中設(shè)備名相同gsensor_direct_xG-sensor x 軸的方向,當(dāng)定義成 true 時(shí),x 軸取正值
53、,當(dāng)定義為 false 時(shí),x 軸取負(fù)值gsensor_direct_yG-sensor y 軸的方向,當(dāng)定義成 true 時(shí),y 軸取正值,當(dāng)定義為 false 時(shí),y 軸取負(fù)值gsensor_direct_zG-sensor z 軸的方向,當(dāng)定義成 true 時(shí),z 軸取正值,當(dāng)定義為 false 時(shí),z 軸取負(fù)值gsensor_xy_revertXY 軸對(duì)調(diào),當(dāng)設(shè)為 TRUE 時(shí),x 軸變?yōu)樵瓉?lái) y 軸第 - 26 - 頁(yè)共 31 頁(yè)第二步 交換 X,Y 方向當(dāng)需要 X,Y 方向交換時(shí),此時(shí)需要找到當(dāng)前使用模組的方向向量(根據(jù)模組的名稱)。如果此時(shí)該 X,Y 軸互換向量(gsensor_
54、xy_revert)的值為 false,則需要修改為true,當(dāng)為 true,則需要修改為 false。通過(guò) adb s system/usr 下,重啟機(jī)器,按第一步觀察現(xiàn)象。再次調(diào)試 X,Y 軸方向:第一步觀察現(xiàn)象:將修改后的 gsnesor.cfg 文件 push 到首先假定長(zhǎng)軸為 X 軸,短軸為 Y 軸,以 X 軸為底邊將機(jī)器立起來(lái),查看機(jī)器的方向是否正確,如果正確,說(shuō)明長(zhǎng)軸配置正確,如果方向正好相反,說(shuō)明長(zhǎng)軸配置錯(cuò)誤。將機(jī)器旋轉(zhuǎn)到短軸,查看機(jī)器方向是否正確,如果正確,說(shuō)明短軸配置正確,如果方向正好相反,說(shuō)明短軸配置錯(cuò)誤。第二步修改 X,Y 軸方向:當(dāng)需要修改 X,Y 軸方向時(shí),當(dāng)只有長(zhǎng)
55、軸方向相反或者是只有短軸方向相反時(shí),則只修改方向不正確的一個(gè)軸,當(dāng)兩個(gè)方向都相反時(shí),則同時(shí)修改 X 與 Y 軸方向向量。找到當(dāng)前使用模組的方向向量(根據(jù)模組的名稱)。若長(zhǎng)軸方向相反,如果此時(shí)該方向 X 軸向量(gsnesor_direct_x)的值為 false,則需要修改為 true,當(dāng)為 true,則需要修改為 false。若短軸方向相反,如果此時(shí)該方向 Y 軸向量(gsnesor_direct_y)的值為 false,則需要修改為 true,當(dāng)為 true,則需要修改為 false。通過(guò) adb s將修改后的 gsnesor.cfg 文件 push 到 system/usr 下,重啟機(jī)器
56、,按第一步觀察現(xiàn)象。若發(fā)現(xiàn)還是反向 X 軸或者 Y 軸的方向仍然相反,則說(shuō)明 X 軸為短軸,Y 軸為長(zhǎng)軸。此時(shí):若長(zhǎng)軸方向相反,如果此時(shí)該方向 Y 軸向量(gsnesor_direct_y)的值為 false,則需要修改為 true,當(dāng)為 true,則需要修改為 false。若短軸方向相反,如果此時(shí)該方向 X 軸向量(gsnesor_direct_x)的值為 false,則需要修改為 true,當(dāng)為 true,則需要修改為 false。驅(qū)動(dòng)的加載在android 上移植G-sensor 還必須將驅(qū)動(dòng)拷貝到 android 打包目錄的對(duì)應(yīng)文件夾中,并在init.sunxi 中將其加載。具體修改方
57、法如下:、android4.x.xandroid4.x.x 會(huì)在 extract-bsp 的時(shí)候?qū)⑵淇截惖綄?duì)應(yīng)目錄。android4.x.x 對(duì)應(yīng)的目錄已經(jīng)更改為:$PRODUCT_ROOT/system/vendor/modules/、修改 init.sunxi.rc 文件,android4.x.x 修改 init.sun7i.rc,在對(duì)應(yīng)的文件中添加: insmod /vendor/modules/bma250.ko若使用自動(dòng)檢測(cè)功能時(shí),不需要增加該語(yǔ)句,只需要在該文件中增加: insmod/vendor/modules/sw_device.ko 自動(dòng)檢測(cè)驅(qū)動(dòng),同時(shí) sysconfig.f
58、ex 文件中需要增加_list_para 的配置選項(xiàng),該配置項(xiàng)的詳細(xì)信息,請(qǐng)查看第二章。第 - 27 - 頁(yè) 共 31 頁(yè)7.模塊調(diào)試7.1 調(diào)試信息的使用方法驅(qū)動(dòng)加載時(shí),設(shè)置打印等級(jí)在驅(qū)動(dòng)編譯為模塊的情況下,可以在驅(qū)動(dòng)加載時(shí),設(shè)置 debug_mask 的值,從而實(shí)現(xiàn)對(duì)各級(jí)打印消息的開關(guān)控制。如下所示insmod /system/vendor/modules/bma250.ko debug_mask=0 x0b通過(guò) s將打印打開通過(guò) s將打印打開步驟如下:一、登錄到 s界面(adb s或者是串口調(diào)試等)二、進(jìn)入模塊節(jié)點(diǎn),使用命令:三、查看模塊參數(shù)名稱四、查看模塊當(dāng)前參數(shù)值五、設(shè)置模塊參數(shù)值六
59、、查看設(shè)置是否成功注意 # 號(hào)后面的為命令,然后鍵入回鍵即可。echo 命令中,“”號(hào),前后均為空格。gsensor 驅(qū)動(dòng)調(diào)試步驟確保硬件各個(gè)管腳的連接順序正確;上電,測(cè)試各個(gè)管腳信號(hào)的電壓正常,只有在保證硬件正常的情況下,進(jìn)行軟件驅(qū)動(dòng)調(diào)試,方可保證驅(qū)動(dòng)能夠正常工作(該處最容易被很多軟件開發(fā)必注意,方可節(jié)省大部分時(shí)間)忽視,務(wù)(3)將串口打印信息打開,串口打印信息設(shè)置:通過(guò) adb s命令進(jìn)入目錄/proc/sys/kernel,輸入 echo 8 4 1 7 prk 將打印等級(jí)設(shè)為 8。gsensor 驅(qū)動(dòng)中所有的打印第 - 28 - 頁(yè) 共 31 頁(yè)信息打開,查看驅(qū)動(dòng)程序的配置信息狀態(tài)以及
60、 I2C 的初始化狀態(tài)。(4)查看 i2c 通信狀態(tài),當(dāng)串口打印信息顯示 i2C 通信失敗時(shí),主要有以下兩個(gè)原因:一是硬件上的,各個(gè)信號(hào)線接觸不良,所以出現(xiàn)通信失敗時(shí),檢查各引腳接觸情況和電壓情況。二是因?yàn)?I2C 的地址不正確導(dǎo)致,因?yàn)?i2C 地址為 7 為地址,所以可能是因?yàn)樵谂渲玫臅r(shí)候沒(méi)有移位或者是觸控 IC 有多個(gè) I2C 地址,導(dǎo)致地址不匹配。若排除了以上兩種原因后,還是不能正確進(jìn)行 i2c 傳輸,則打開 i2c 傳輸打印,查看傳輸打印狀態(tài), 在編譯服務(wù)器上,目錄為 workspaceexdroidlicheelinux-3.4 上,輸入命令:make ARCH=armconfig
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 撥云見日介紹
- 拒絕校園霸凌11
- 火災(zāi)安全班會(huì)
- 手術(shù)室無(wú)菌包管理質(zhì)量
- (教學(xué)實(shí)錄)第四單元:三國(guó)兩晉南北朝時(shí)期:政權(quán)分立與民族交融-大單元下的教學(xué)評(píng)一致性實(shí)施課堂
- 傳統(tǒng)節(jié)日與小學(xué)生勞動(dòng)教育的結(jié)合實(shí)踐
- 兒童自我保護(hù)意識(shí)培養(yǎng)與教育
- 2025年遼源道路運(yùn)輸從業(yè)資格考試系統(tǒng)
- 小學(xué)數(shù)學(xué)二年級(jí)第二學(xué)期口算計(jì)算共3012道題
- 監(jiān)獄反恐防暴培訓(xùn)
- 鐵路建設(shè)項(xiàng)目施工企業(yè)信用評(píng)價(jià)辦法(鐵總建設(shè)〔2018〕124號(hào))
- 模具報(bào)價(jià)表精簡(jiǎn)模板
- 形式發(fā)票模板 PI模板 英文版
- 初一的最美的風(fēng)景高分的作文600字
- 高考英語(yǔ)單項(xiàng)選擇題題庫(kù)題
- 檢驗(yàn)檢測(cè)機(jī)構(gòu)資質(zhì)認(rèn)定現(xiàn)場(chǎng)評(píng)審日程表及簽到表
- 完整版高低壓開關(guān)柜投標(biāo)文件技術(shù)標(biāo)
- 蘭州市行政區(qū)劃代碼表
- 管鮑之交-歷史劇劇本(共4頁(yè))
- [交流][jtag]跟我學(xué)jtag協(xié)議破解——第一彈初識(shí)jtagtap狀態(tài)機(jī)
- 尼康FM2說(shuō)明書25頁(yè)
評(píng)論
0/150
提交評(píng)論