講稿a80t g-sensor開發(fā)說明書_第1頁
講稿a80t g-sensor開發(fā)說明書_第2頁
講稿a80t g-sensor開發(fā)說明書_第3頁
講稿a80t g-sensor開發(fā)說明書_第4頁
講稿a80t g-sensor開發(fā)說明書_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第 - 3 - 頁 共 31 頁目錄A80T錯誤!未定義書簽。G-sensor 開發(fā)說明書.- 1 -1. 前言.- 5 -1.1. 編寫目的.- 5 -1.2. 適用范圍.- 5 -1.3. 相關.- 5 -2 模塊介紹.- 6 -2.1.模塊功能介紹.- 6 -2.2.硬件介紹.- 6 -2.3.源碼結構介紹.- 6 -2.4.模塊配置介紹.- 7 -2.4.1. sys_config fex 配置 .- 7 -2.4.2.config 的配置.- 8 -3.模塊體系結構描述.- 12 -4.模塊數(shù)據(jù)結構描述.- 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ū)動概述.- 15 -5.2. G-sensor 移植.- 15 -5.2.1.驅(qū)動中 INPUT 子系統(tǒng)關鍵接口.- 15 -5.2.2. I2C 設備關鍵接口.- 15 -5.2.3.設備驅(qū)動關鍵變量.- 16 -5.2.4.需要包含的頭文件.- 16 -5.2.5. I2C 地址 .- 16 -5.2.6. detect 函數(shù).- 16

3、 -5.2.7.G-sensor 驅(qū)動 init 函數(shù).- 18 -5.2.8. super standby 支持.- 19 -5.2.9.模塊加載及 resume 延時優(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ū)動調(diào)試信息.- 23 -6.G-sensor Android 層配置.- 25 -6.1 方向的配置.- 25 -6.2 驅(qū)動的加載.- 26 -7.模塊調(diào)試.- 27 -7.1 調(diào)試信息的使用方法.- 27 -7.

4、2 gsensor 驅(qū)動調(diào)試步驟.- 27 -7.3. G-sensor 測試.- 30 -第 - 4 - 頁 共 31 頁8.Declaration.- 31 -第 - 5 - 頁 共 31 頁前言編寫目的文檔對 G-sensor 硬件以及軟件相關的調(diào)試與移植過程作詳細的講解,同時對G-sensor 的使用與測試作簡要的講解,為達到能快速移植驅(qū)動與使用 G-sensor 的目的。1.2. 適用范圍介紹本模塊設計適用 A80T。1.3. 相關項目中G-sensor 驅(qū)動的開發(fā),以及使用應認真閱讀該文檔。模塊介紹模塊功能介紹在人機交互過程中,G-sensor 起著非常重要的作用,gsensor

5、作為輸入設備,能感知當前G-sensor 傳感器所處的空間狀態(tài),附著在 pad 上配合使用,能測量出 pad 在空間上的坐標狀態(tài),從而獲知 pad 用戶的操作意圖:橫豎屏切換,轉(zhuǎn)彎等。2.2.硬件介紹目前 G-sensor 與 HOST 的連接有 4 個 pin 腳,分別為 VCC,GND,SDA,SCL。引腳正常工作時候的高電平均為 3.3V。圖 1 G-sensor 硬件連接圖G-sensor 的調(diào)試中,首先確認硬件的正確性。硬件調(diào)試中,需要確認下列項:、確認各個引腳與 HOST 連接的正確性。電源電壓是不是正常的,VCC 是否為 3.3V,GND 是否為 0。 I2C 引腳電平是否匹配。

6、確認設備使用的 I2C 地址,特別是設備可以設置為多個地址時。2.3.源碼結構介紹G-sensor 驅(qū)動源碼位于如下兩個目錄中。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 - 頁 共 31 頁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 中關于G-sensor 的配置項如下: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=文件配置說明如下:目前G-sensor 采用輪詢工作方式,在 sysconfig 中只需指定如下兩個信息即可:G-sensor_used 設為 1,代表啟用 G-sensor;G-sensor_twi_id 根據(jù)具體的電路,選擇對應的 I2C;(2)gsensor 自動檢測配置使用自動檢測功能時,需要增加以下配置信息,增加設備的可選擇性。如果gsensor_used 設置為0 則將退出gsensor的自動檢測。;配置項配置項含義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 - 頁 共 31 頁; 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 /設置為 1 時,啟動自動檢測,設置為 0 時,退出自動檢測。= 1 /設置為 1,該模塊支持的 I2C 地址添加到掃描列表= 1= 1= 1= 1= 1= 1= 1= 0 /設置為 0,該模塊支持的 I2C 地址從掃描

11、列表中剔除= 1= 1= 0= 0當gsensor_det_used 設置為 1 時,啟用自動檢測,將設置為 0 時,退出自動檢測。模塊的名稱后面寫 1 表示添加到自動檢測掃描列表,寫 0 表示剔除自動檢測掃描列表。gsensor_list_para 列表中的名稱順序必須與 sw_device.c 中 gsensors 的名稱順序一一對應。2.4.2.config 的配置對于G-sensor 的的內(nèi)核配置,可通過命令 make ARCH=arm界面,并按以下步驟操作:首先,選擇Device Drivers 選項進入下一級配置,如圖 2 所示:config 進入配置主第 - 9 - 頁 共 31

12、 頁圖 2 :Device Drivers 選項配置進入Device Drivers 配置后,如果需要配置 mma7660,mma8452,mma865x,afa750等,選擇Hardware Monitoring support,如圖 3 所示:圖 3 :Hardware Monitoring support 選項配置Hardware Monitoring support 選項配置下的驅(qū)動如下圖所示:第 - 10 - 頁 共 31 頁圖 4 :Hardware Monitoring support設備驅(qū)動進入Device Drivers 配置后,如果需要配置 bma250,lis3de,li

13、s3dh 等,選擇 G-sensor support,如圖 5 所示:圖 5 :I2C G-sensor support 選項配置最后,選擇相應的 G-sensor 模塊驅(qū)動選項,可選擇直接編譯進內(nèi)核,也可以選擇編譯成模塊。如圖 6 所示:第 - 11 - 頁 共 31 頁圖 6 G-sensor 驅(qū)動模塊選項配置第 - 12 - 頁共 31 頁3.模塊體系結構描述G-sensor 模塊的體系結構圖,如圖 6 所示。/dev/input/eventX/dev/input/misc/dev/iinnput/jsUser spaceKernel spaceIInporeIInnpput EEvve

14、nt DriiveersGsensor driverI2C ddriverrI2C BUSI2C控制器Hardware圖 6:G-sensor 模塊體系結構圖G-sensor 設備為使用 I2C 總線進行通信的輸入設備,G-sensor driver 通過調(diào)用 I2C驅(qū)動的相應接口來實現(xiàn)對 G-sensor 設備的控制、通信,如 G-sensor driver 對G-sensor 設備硬件各寄存器的讀寫等。G-sensor driver 將底層硬件對用戶輸入的響應轉(zhuǎn)換為標準的輸入事件,再通過層對下提供了 G-sensor driver 的編程接層(Inpore)提交給事件處理層;而口,對上又提

15、供了事件處理層的編程接口;而事件處理層(input Event Driver)就為我們用戶空間的應用程序提供了 間將根據(jù)設備的節(jié)點進行數(shù)據(jù)的設備的接口和驅(qū)動層提交來的事件處理。用戶空以及相應的處理。Gsensor設備第 - 13 - 頁共 31 頁模塊數(shù)據(jù)結構描述struct i2c_driver bma250_driverbma250_driver:該變量會到 i2c_driver 中, 為匹配設備名,probe為設備的偵測函數(shù),address_list 為 I2C 的 scan 地址,suspend的休眠喚醒函數(shù)。sic struct i2c driver bma25

16、0 driver = .class = I2C_CLASS_HWMON,.driver = .owner = THIS_MODULE,與 resume 為進內(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ū)動所需要的信息的集合,用于幫助實現(xiàn)對采樣信息的處理。struct bma250_data struct i2c_cnt *bma250_cnt; atomic_t delay;atomic_t enable; unsigned char mode;struct input_dev *input;第 - 14 - 頁共 31 頁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; ;采樣時獲得的 x 軸,y 軸,z 軸的坐標信息。4.4

19、.strucstrucsor_config_infosor_config_info 用于到的 sysconfig.fex 中gsensor 的相關信息。input_type 為 gsensor 設備的類型,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 - 頁共

20、31 頁模塊移植 demoG-sensor 驅(qū)動概述G-sensor 驅(qū)動作為硬件與軟件的一個橋梁,實現(xiàn)對 G-sensor 控制器硬件初始化,獲取G-sensor 控制器到的位置坐標信息(必要時,對數(shù)據(jù)進行濾波和用戶操作意圖識別),上報用戶操作相關信息于操作系統(tǒng),經(jīng)上層系統(tǒng)處理后,正確響應用戶的意圖。G-sensor 驅(qū)動在系統(tǒng)中必須滿足如下要求:接口:G-sensor 驅(qū)動,不應自行決定是否上報,上報頻率等,應提供接口,供上層應用控制驅(qū)動的運行和數(shù)據(jù)上報:包括使能控制 Enable, 上報時延 delay 等;通常通過 sys 文件系統(tǒng)提供,這部分實現(xiàn),遵循標準的 linux 規(guī)范;上報數(shù)

21、據(jù)的方式:或者提供接口供上層(eg: ioctl),或者掛接在 input 系統(tǒng)子系統(tǒng)上,使用 input 系統(tǒng)子系統(tǒng)的接口,供上層使用(eg: inpore)。5.2. G-sensor 移植驅(qū)動的移植中主要需要關注點為如何獲取sys_config.fex 中的配置信息,detect 函數(shù), suspend 以及 resume 函數(shù)等。以下將以 bma250 系列驅(qū)動移植過程為例進行說明。源碼路徑為:licheelinux-3.4driversG-sensorbma250.c5.2.1.驅(qū)動中 INPUT 子系統(tǒng)關鍵接口這部分接口是 linux INPUT 子系統(tǒng)對外提供的接口,G-sens

22、or driver 使用這些接口,向input 子系統(tǒng)設備和上報數(shù)據(jù)。(1)申請input_dev 結構:struct input_dev *input_allocate_device(void)(2)輸入設備,并和對應的 handler 處理函數(shù)掛鉤:input_register_devitruct input_dev *dev)(3)注銷Input 設備:input_unregister_devitruct input_dev *dev)上報坐標值(絕對值):sic inline void input_report_abs(struct input_dev *dev, unsigned v

23、alue)上報坐標結束時同步信號:sic inline void input_sync(struct input_dev *dev)code,5.2.2. I2C 設備關鍵接口目前G-sensor 設備驅(qū)動使用的都是 I2C 總線進行通信,關鍵的接口如下所示:第 - 16 - 頁共 31 頁i2c_set_cntdata將設備驅(qū)動的私有數(shù)據(jù)連接到設備 cnt 中。i2c_get_cntdata獲取設備cnt 的設備驅(qū)動的私有數(shù)據(jù)。i2c_add_driver通過 I2C的 i2c_add_driver()函數(shù)添加 i2c_driver,使用到的關鍵數(shù)據(jù)結構為i2c_driver,注意i2c_d

24、river 中使用的 name 需與 INPUT 中的 input_dev name 一致,否則有會出現(xiàn)找不到設備的情況。在 bma250.c 驅(qū)動中的 i2c_driver 變量為 bma250_driver,其具體定義在 4.1 節(jié)中已經(jīng)給出。(4)i2c_del_driver通過 I2C的i2c_del_driver()函數(shù)刪除 i2c_driver。(5)sysfs_create_groupsysfs 接口,使用如下格式進行創(chuàng)建:sysfs_create_group(&pdev-dev.kobj, &dev_attr_grp);5.2.3.設備驅(qū)動關鍵變量移植新的設備驅(qū)動時,需要設置一

25、些跟相關的關鍵的變量,如表所示:5.2.4.需要包含的頭文件Gsensor 驅(qū)動中需要包含頭文件:#include 這個頭文件中包含使用的 struc相關調(diào)用接口與打印等級的定義。sor_config_info 結構體以及sysconfig.fex 的該文件的具體實現(xiàn):licheelinux-3.4driversinputsw_device.c5.2.5. I2C 地址在G-sensor 驅(qū)動中 I2C 地址有四個,均放置在掃描地址數(shù)組normal_i2c。 normal_i2c 地址以固定的形式存在于設備驅(qū)動中。存放設備地址的數(shù)組必須以I2C_CNT_END 標致結束。如下所示: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設置打印等級變量在 module_para_name 中使用normal_i2cI2C 總線掃描地址數(shù)組i2c_driver 結構體中,設備地址i2c_addressI2C 總線detect 函數(shù)掃描地址數(shù)組gsensor_detect 函數(shù)掃描地址第 - 17 - 頁共 31 頁G-sensor 驅(qū)動中的 gsensor_detect 函數(shù)實現(xiàn)硬件檢測功能,它會遍歷此驅(qū)動支持所的 I2C 地

27、址,如果某個 I2C 地址能夠正常通信并讀到了正確的 chip_id,則 dectect有成功,繼續(xù)加載驅(qū)動。否則此驅(qū)動支持的沒有在電路中,驅(qū)動模塊加載失敗。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 - 頁共 31 頁i2c_address 數(shù)組了此驅(qū)動支持的所有的I2C 地址,對每個I2C 地址chip_id,如果成功,且為驅(qū)動支持的 chip_id,則 detect 成功。如果設備沒有 chi detect 為例子如下所示:的可以進行 i2c 檢測設備是否存在。如下所示:以 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ū)動 init 函數(shù)該函數(shù)中主要任務為調(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 設備驅(qū)動。如dprk(DEBUG_INIT, bma250: initn);第 - 19 - 頁共 31 頁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 就是關掉除 AVCC 和DRAM_VCC 電源以外的所有電源,因此在休眠時gsensor 會被斷電,在 resume

34、時,需要重新初始化 gsensor 的一些寄存器。以 bma250 為例,其 suspend 函數(shù)及 resume 函數(shù)如下。在 suspend 時判斷休眠類型是否為 super standby,如果是,則保存當前 gsensor 的一些寄存器信息。在 resume 時,判斷是否為 super standby,如果是,則將 suspend 時保存的寄存器信息重新寫入 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)將設備關閉,否則將可以導致設備無法進入休眠。以 mma8452 為例子進行說明。字體加粗部分即為打開與關閉輪詢延時工作隊列的函數(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 - 頁共 31 頁 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 延時優(yōu)化有些G-sensor 在初始化時,初始化寄存器后,需要一定的延時才能正常工作。一般這個延時都是忙等待,這樣在加載驅(qū)動及 super sta

38、ndby 喚醒時,相當耗時,影響用戶體驗。現(xiàn)在進行了優(yōu)化。思路是采用工作隊列線程將寄存器初始化部分單獨延后執(zhí)行,不影響主進程的運行。以 mma8452 為例,它在初始化寄存器時有一個 100ms 的延時。因此,在其休眠喚醒時的 resume 函數(shù)中進行了相應的優(yōu)化,其源碼如下,在休眠喚醒時 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 ;字體加黑的部分為啟動工作隊列線程來將 mma8452 的寄存器初始化延后執(zhí)行。mma8452_resume_work 對應的執(zhí)行函數(shù)為 mma8452_resume_events,其源碼如下。 sic void mma8452_resume_events (struct wor

40、k_struct *work)第 - 22 - 頁 共 31 頁mma8452 init cnt(mma8452 i2c cnt);mma8452_init_cnt 為初始化 mma8452 寄存器函數(shù),其中有一個 100ms 的忙等待延時。這部分的總體實現(xiàn)請參考 mma8452.c 源碼。5.2.10.模塊 remove 函數(shù) check模塊卸載時,注意 probe 函數(shù)與 init 函數(shù)中申請的資源,要依照申請的順序進行釋放,后申請的先。如果申請的資源沒有,或沒有按照順序,在模塊卸載時,會卸載失敗,甚至導致死機。同時,在卸載時,注意要調(diào)用 i2c_set_cntdnt, NULL);函數(shù)。

41、否則驅(qū)動自己是可以正常卸載的,但卸載后,向此 I2C 加載其它 gsensor 驅(qū)動時會出現(xiàn) I2C 通訊不成功問題。5.2.11.Sysfs 接口Gsensor 驅(qū)動中,需要提供使能控制以及上報時延等基本接口,通常通過 sysfs 文件系統(tǒng)提供,sensors 的驅(qū)動中,使能控制命名為 enable,上報時延為 delay,如果名字變換,將可能造成 hal 層將無法向驅(qū)動層中寫入使能控制以及時延,造成設備不工作或者是數(shù)據(jù)上報慢,影響體驗效果。(1)函數(shù)宏 DEVICE_ATTRDEVICE_ATTR宏有四個參數(shù),分別是名稱、權限位、讀函數(shù)、寫函數(shù)。其中讀函數(shù)和寫函數(shù)是讀寫功能函數(shù)的函數(shù)名。需

42、要 的使能控制的名稱應該設置為 enable;上報時延的名稱應該設置為 delay。基本函數(shù)為 enable 以及 delay,如需要進行相關的調(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 結構體的填充將DEVICE_ATTR的接口填充到 attribu

43、te 結構體中,如下所示:sic struc.tribute *bma250_attributes = &dev_attr_delay.attr,&dev attr enable.attr, NULL第 - 23 - 頁共 31 頁;該結構體必須以 NULL 結束。(3)attribute_group 結構體的填充完成了attribute 結構體的填充后,將實現(xiàn) attribute_group 結構體的填充,如下所示:sic structribute group bma250 attribute group = .attrs = bma250 attributes;(4)sysfs 接口的調(diào)用

44、系統(tǒng)提供函數(shù),進行,如下:err = sysfs_create_group(&data-input-dev.kobj,&bma250_attribute_group);5.2.12.Kconfig 和 Makefile 文件添加一個新的 G-sensor 驅(qū)動需要修改 Kconfig 文件和 Makefile 文件以使得能夠在config 中選中 G-sensor 驅(qū)動并編譯生成模塊或者是直接編譯進內(nèi)核。現(xiàn) bma250.c為例,將源碼拷貝到目錄: .exdroidlicheelinux-3.4driversgsensor 下,按照文件 Kconfig與Makefile 的形式,將 G-sen

45、sor 的驅(qū)動Kconfig 文件:config SENSORS_BMA250trise BMA250 acceleration sensor support depends on I2Chelp進去,如下:If you say yes here you get support foracceleration sensors BMA250 Makefile 文件:ch Sensortecsobj-$(CONFIG_SENSORS_BMA250)+= bma250.o兩個文件中設置的名字必須一致,即“CONFIG_SENSORS_BMA250”需一致,編譯之后會自動的生成.Ko 文件。添加之后可

46、以到系統(tǒng)中查看是否添加成功,在編譯服務器上,目錄為 workspaceexdroidlicheelinux-3.4 上,輸入命令:make ARCH=armconfig進入目錄Device Driversgsensor support 即可看到添加的驅(qū)動。5.2.12.驅(qū)動調(diào)試信息為了實現(xiàn)動態(tài)開關打印信息,在 input 子系統(tǒng)的驅(qū)動模塊中加入一個模塊參數(shù)debug_mask。驅(qū)動中所有的打印 prk 前加一個 if 條件判斷語句,進行打印等級與debug_mask 的按位與,debug_mask 相應等級位為真(1),則打印此 pr則關閉此打印。在G-sensor 代碼 bma250.c 中

47、,打印消息設置如下。k,為假(0)第 - 24 - 頁共 31 頁在文件開頭,首先定義打印等級,模塊參數(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);如代碼中所示,枚舉定義了打印等級,每一個等級占用一位。debug_mask 為

48、控制打印的模塊參數(shù),默認為 0,關閉所有的打印。dprk 函數(shù)為封裝好的打印函數(shù),在驅(qū)動中調(diào)用它來打印相關的調(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)試信息,打印等級設為DEBUG_SU

49、SPEND。當 debug_mask 的第 3 位為 1,則此條打印消息會成功打印;當debug_mask 的第 3 位為 0,則此打印消息。在具體的驅(qū)動調(diào)試中,如果驅(qū)動編譯成模塊,則在驅(qū)動加載時,設置 debug_mask的值,從而實現(xiàn)對各級打印消息的開關控制。insmod /system/vendor/modules/bma250.ko debug_mask=0 x0b此方法存在的問題:當驅(qū)動加載不成功時,沒有模塊參數(shù)文件節(jié)點來讓修改debug_mask 的值,為了避免這個不足,在初始化函數(shù) init 及 probe 函數(shù)中的初始化 fail的相關打印最好寫成 prk 直接打印,這些 pr

50、k 在模塊正常工作時是不會被打印的,只有模塊加載失敗時才會被打印出來。第 - 25 - 頁共 31 頁6.G-sensor Android 層配置添加 G-sensor驅(qū)動模塊對應 的 hal層。 G-sensor的 hal層源碼為 androiddevioftwinnermonhardwarelibhardwarelibsensors目錄下的。6.1 方向的配置同時,在 androiddevi下幾個變量。oftwinnerkylin-目錄下有個 gsensor.cfg 文件,了如因為最終產(chǎn)品電路設計可能不一樣,導致 G-sensor 可能貼的方向不一樣,所以會出現(xiàn)添加G-sensor 后,用

51、戶實際使用中會出現(xiàn) G-sensor 方向不對的現(xiàn)象。需要根據(jù)以下步驟進行方向的調(diào)試。Gsensor 方向調(diào)試說明:假定機器的長軸為 X 軸,短軸為 Y 軸,垂直方向為 Z 軸。首先調(diào)試Z 軸:第一步觀察現(xiàn)象:旋轉(zhuǎn)機器,發(fā)現(xiàn)當只有垂直 90時或者是在旋轉(zhuǎn)后需要抖動一下,方向才會發(fā)生變化,則說明 Z 軸反了。若當機器大概 45拿著的時候也可以旋轉(zhuǎn),說明 Z 軸方向正確。無需修改Z 軸方向。第二步修改 Z 軸為正確方向。此時需要找到當前使用模組的方向向量(根據(jù)模組的名稱)。如果此時該方向 Z 軸向量(gsnesor_direct_z)的值為 false,則需要修改為 true;當為 true,則需

52、要修改為 false。通過 adb s觀察現(xiàn)象。將修改后的 gsnesor.cfg 文件 push 到 system/usr 下,重啟機器,按第一步其次查看 X,Y 軸是否互換:第一步觀察現(xiàn)象:首先假定長軸為 X 軸,短軸為 Y 軸,以 X 軸為底邊將機器立起來。查看機器的 X, Y 方向是否正好互換,若此時機器的 X,Y 方向正好互換,在說明需要將 X,Y 方向交換。若此時 X,Y 方向沒有反置,則進入 X,Y 方向的調(diào)試。gsensor_nameG-sensor 名稱,必須與驅(qū)動中設備名相同gsensor_direct_xG-sensor x 軸的方向,當定義成 true 時,x 軸取正值

53、,當定義為 false 時,x 軸取負值gsensor_direct_yG-sensor y 軸的方向,當定義成 true 時,y 軸取正值,當定義為 false 時,y 軸取負值gsensor_direct_zG-sensor z 軸的方向,當定義成 true 時,z 軸取正值,當定義為 false 時,z 軸取負值gsensor_xy_revertXY 軸對調(diào),當設為 TRUE 時,x 軸變?yōu)樵瓉?y 軸第 - 26 - 頁共 31 頁第二步 交換 X,Y 方向當需要 X,Y 方向交換時,此時需要找到當前使用模組的方向向量(根據(jù)模組的名稱)。如果此時該 X,Y 軸互換向量(gsensor_

54、xy_revert)的值為 false,則需要修改為true,當為 true,則需要修改為 false。通過 adb s system/usr 下,重啟機器,按第一步觀察現(xiàn)象。再次調(diào)試 X,Y 軸方向:第一步觀察現(xiàn)象:將修改后的 gsnesor.cfg 文件 push 到首先假定長軸為 X 軸,短軸為 Y 軸,以 X 軸為底邊將機器立起來,查看機器的方向是否正確,如果正確,說明長軸配置正確,如果方向正好相反,說明長軸配置錯誤。將機器旋轉(zhuǎn)到短軸,查看機器方向是否正確,如果正確,說明短軸配置正確,如果方向正好相反,說明短軸配置錯誤。第二步修改 X,Y 軸方向:當需要修改 X,Y 軸方向時,當只有長

55、軸方向相反或者是只有短軸方向相反時,則只修改方向不正確的一個軸,當兩個方向都相反時,則同時修改 X 與 Y 軸方向向量。找到當前使用模組的方向向量(根據(jù)模組的名稱)。若長軸方向相反,如果此時該方向 X 軸向量(gsnesor_direct_x)的值為 false,則需要修改為 true,當為 true,則需要修改為 false。若短軸方向相反,如果此時該方向 Y 軸向量(gsnesor_direct_y)的值為 false,則需要修改為 true,當為 true,則需要修改為 false。通過 adb s將修改后的 gsnesor.cfg 文件 push 到 system/usr 下,重啟機器

56、,按第一步觀察現(xiàn)象。若發(fā)現(xiàn)還是反向 X 軸或者 Y 軸的方向仍然相反,則說明 X 軸為短軸,Y 軸為長軸。此時:若長軸方向相反,如果此時該方向 Y 軸向量(gsnesor_direct_y)的值為 false,則需要修改為 true,當為 true,則需要修改為 false。若短軸方向相反,如果此時該方向 X 軸向量(gsnesor_direct_x)的值為 false,則需要修改為 true,當為 true,則需要修改為 false。驅(qū)動的加載在android 上移植G-sensor 還必須將驅(qū)動拷貝到 android 打包目錄的對應文件夾中,并在init.sunxi 中將其加載。具體修改方

57、法如下:、android4.x.xandroid4.x.x 會在 extract-bsp 的時候?qū)⑵淇截惖綄夸洝ndroid4.x.x 對應的目錄已經(jīng)更改為:$PRODUCT_ROOT/system/vendor/modules/、修改 init.sunxi.rc 文件,android4.x.x 修改 init.sun7i.rc,在對應的文件中添加: insmod /vendor/modules/bma250.ko若使用自動檢測功能時,不需要增加該語句,只需要在該文件中增加: insmod/vendor/modules/sw_device.ko 自動檢測驅(qū)動,同時 sysconfig.f

58、ex 文件中需要增加_list_para 的配置選項,該配置項的詳細信息,請查看第二章。第 - 27 - 頁 共 31 頁7.模塊調(diào)試7.1 調(diào)試信息的使用方法驅(qū)動加載時,設置打印等級在驅(qū)動編譯為模塊的情況下,可以在驅(qū)動加載時,設置 debug_mask 的值,從而實現(xiàn)對各級打印消息的開關控制。如下所示insmod /system/vendor/modules/bma250.ko debug_mask=0 x0b通過 s將打印打開通過 s將打印打開步驟如下:一、登錄到 s界面(adb s或者是串口調(diào)試等)二、進入模塊節(jié)點,使用命令:三、查看模塊參數(shù)名稱四、查看模塊當前參數(shù)值五、設置模塊參數(shù)值六

59、、查看設置是否成功注意 # 號后面的為命令,然后鍵入回鍵即可。echo 命令中,“”號,前后均為空格。gsensor 驅(qū)動調(diào)試步驟確保硬件各個管腳的連接順序正確;上電,測試各個管腳信號的電壓正常,只有在保證硬件正常的情況下,進行軟件驅(qū)動調(diào)試,方可保證驅(qū)動能夠正常工作(該處最容易被很多軟件開發(fā)必注意,方可節(jié)省大部分時間)忽視,務(3)將串口打印信息打開,串口打印信息設置:通過 adb s命令進入目錄/proc/sys/kernel,輸入 echo 8 4 1 7 prk 將打印等級設為 8。gsensor 驅(qū)動中所有的打印第 - 28 - 頁 共 31 頁信息打開,查看驅(qū)動程序的配置信息狀態(tài)以及

60、 I2C 的初始化狀態(tài)。(4)查看 i2c 通信狀態(tài),當串口打印信息顯示 i2C 通信失敗時,主要有以下兩個原因:一是硬件上的,各個信號線接觸不良,所以出現(xiàn)通信失敗時,檢查各引腳接觸情況和電壓情況。二是因為 I2C 的地址不正確導致,因為 i2C 地址為 7 為地址,所以可能是因為在配置的時候沒有移位或者是觸控 IC 有多個 I2C 地址,導致地址不匹配。若排除了以上兩種原因后,還是不能正確進行 i2c 傳輸,則打開 i2c 傳輸打印,查看傳輸打印狀態(tài), 在編譯服務器上,目錄為 workspaceexdroidlicheelinux-3.4 上,輸入命令:make ARCH=armconfig

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論