將新的驅動源文件添加進android內核進行編譯


 

 

1,同目錄下的makefile,如

#
# Makefile for industrial I/O Magnetometer sensors
#

obj-$(CONFIG_SENSORS_AK8975)    += ak8975.o
obj-$(CONFIG_SENSORS_HMC5843)    += hmc5843.o

 

 

2,同目錄下的kconfig

 

#
# Magnetometer sensors
#
comment "Magnetometer sensors"

config SENSORS_AK8975
    tristate "Asahi Kasei AK8975 3-Axis Magnetometer"
    depends on I2C
    help
      Say yes here to build support for Asahi Kasei AK8975 3-Axis
      Magnetometer.

      To compile this driver as a module, choose M here: the module
      will be called ak8975.

 

 

3,總的config(配置變量為Y)

各項目配置文件的位置不同,

coffee:kernel/arch/arm/configs/M7023Q-debug-perf_defconfig

juice:common/customer/configs

配置信息如下:

# CONFIG_CFG80211 is not set
CONFIG_EXPERIMENTAL=y
CONFIG_LOCALVERSION="$(KERNEL_LOCAL_VERSION)-perf"
CONFIG_SWAP=y
CONFIG_ZRAM=m
CONFIG_SYSVIPC=y
CONFIG_SENSORS_AK8975=y

 ......

 

查看變量是否在編譯時配置成功:

out/target/product/m7023q/obj/KERNEL_OBJ/include/generated/Autoconf.h

查找CONFIG_SENSORS_AK8975

若在編譯時有配置成功,將找到這一行:

#define CONFIG_SENSORS_AK8975 1

 

4、修改板級文件:

4.0及后續項目統一在:kernel/arch/arm/mach-msm/board-qrd7627a.c

注意juice中,很多配置(如tp)寫在kernel/arch/arm/mach-msm/board-msm7627a-io.c

在代碼中增加新模塊的內容,應該有兩處,第一處設置函數和結構體,第二處實際調用,注意引用上述第3步新增的編譯開關將代碼限制起來。

這些內容大多可以拷貝其它模塊,但是名字要和driver中的相同,注意要改的地方除了名字之外,還有中斷腳和I2C腳。其中固定模塊的中斷腳大部分時候不會改變(如tp就是int:48,reset:26),除非板子的datasheet特別注明才需要改變。但是I2C腳是會隨着slaver device的改變而改變的,需要查清楚。

配置platform_data:

一般需要初始化一個xxx_platform_data結構體(這個結構體的聲明應該讓驅動文件可視,probe中才知道去讀某個platformdata.yyy),並在i2c_board_info結構體中用.platform_data指向它,然后這個i2c_board_info將在板級文件中被注冊(作為函數i2c_register_board_info()的參數)。而這個.platform_data很有可能在驅動的probe函數中調用到,例如:

static struct msg2133_ts_platform_data msg2133_platformdata= {
    .irq   = 0,
    .reset  = GPIO_TP_RESET,    
};

static struct i2c_board_info i2c_info_msg2133_dpt = {
    I2C_BOARD_INFO("msg2133", 0x27),
    .platform_data = &msg2133_platformdata,
};

i2c_info_msg2133_dpt.platform_data->irq = gpio_to_irq(GPIO_TP_INT);//結構體初始化的時候只能以常量賦值,因為此處需要做GPIO到irq的映射,所以要在此處賦值。

i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, &i2c_info_msg2133_dpt, 1);

在驅動的probe中:pdata =client->dev.platform_data;

    ...... = pdata.yyy; ......//(msg2133_ts_platform_data在該文件中可見)

 

修改引腳的詳情見第5步。

 

5、通過整機電路圖查找、配置該硬件的中斷腳(27);通過該硬件的說明書配置I2C腳(0x0d)。

在Android4.1中,sensor類硬件在電路板上的配置文件是:kernel/arch/arm/mach-msm/board-msm7627a-sensor.c

而在Android2.3中,它直接在kernel/arch/arm/mach-msm/board-qrd7627a.c

配置這個結構體:

static struct i2c_board_info akm8975_i2c_info[] __initdata = {
    {
        I2C_BOARD_INFO("akm8975", 0x0e),
        .platform_data =  &akm_platform_data_8975,
        .flags = I2C_CLIENT_WAKE,
        .irq = MSM_GPIO_TO_INT(GPIO_GYRO_INT),
    },
};

以及這個函數:void __init msm7627a_sensor_init(void)
{

......

#ifdef CONFIG_SENSORS_AK8975
    if (machine_is_msm8625_qrd7()) {
        pr_info("i2c_register_board_info AKM8975\n");
        akm_gpio_setup();
        akm_platform_data_8975.gpio_DRDY = 18;
        //akm8975_i2c_info[0].irq = gpio_to_irq(akm_platform_data_8975.gpio_DRDY);
        i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID,
                akm8975_i2c_info,
                ARRAY_SIZE(akm8975_i2c_info));
    }
#endif

 ......

 

6、修改gpio引腳宏定義

/kernel/arch/arm/mach-msm/include/mach/gpio.h

 

 

 

7、配置CPU引腳類型:

modem_proc/dal/drivers/tlmm/src/bsp/7627A/TLMMBsp_M4000E.c

或者

modem_proc/core/dal/drivers/tlmm/src/bsp/7627A/TLMMBsp_M5010.c

.etc.

 

其中組數PRIMARY_CONFIGS中定義了GPIO腳的輸入與輸出:

uint32 PRIMARY_CONFIGS[TLMM_BSP_NUM_GPIO] =
{

  …………

  BSP_GPIO_IN_36,          //GPIO36 KEYPAD_C0
    BSP_GPIO_IN_37,          //GPIO37 KEYPAD_C1
    BSP_GPIO_IN_38,          //GPIO38 KEYPAD_C2
    BSP_GPIO_OUT_39,         //GPIO39 MSM_WAKE_WLAN

  ......

    BSP_GPIO_IN_82,         //GPIO82 DEBUG_SELECT   
    BSP_GPIO_IN_84,

}

其中的in和out是對於CPU而言的,所以中斷腳(外設對cpu產生中斷)是in;reset腳(cpu對外設下達重置命令)是out。

而下面這個數組定義了不同的GPIO腳的控制權限:MASTER->modern; PERIPHERAL->CPU

TLMM_BSP_OwnerProcType TLMM_OWNERS[TLMM_BSP_NUM_GPIO]={

......

  TLMM_OWNER_MASTER, /* 81  */
    TLMM_OWNER_PERIPHERAL, /* 82  */
    TLMM_OWNER_MASTER, /* 83  */

    TLMM_OWNER_PERIPHERAL, /* 84  */
    TLMM_OWNER_PERIPHERAL, /* 85  */

......

}

 

 

 

8、題外話,如果新增的模塊是非kernel的android其它模塊,比如HAL層,此時需要修改一個makefile:

比如給項目7023Q添加device/cct/common/libsku7sensors/akm8975/文件夾下的模塊

模塊名稱在 device/cct/common/libsku7sensors/akm8975/Android.mk定義:LOCAL_MODULE := akmd8975

此時,要在device/cct/M7023Q/M7023Q.mk 中修改PRODUCT_PACKAGES變量,添加一行:akmd8975

 

 

 

仍有疑問,請參見下一篇:

Design House 整合新IC驅動需要解決的主要問題

1、I2C地址是否和其它IC沖突。通過改地址解決

2、I2C通信是否受到其它slaver影響。檢測:示波器測I2C波形。排查:逐個去掉其它I2C部件,看本IC的I2C波形是否恢復正常。

3、是否由於IC本身原因,某個寄存器寫值后無應答。我調的這款LED的reset寄存器就是如此,導致probe 調用reset時報錯,而其他寄存器正常。

4、硬件接觸是否良好。我遇到的是金手指和卡座接觸不良,而且,該金手指上的另一個IC——距離傳感器在較松的插入情況下可以正常工作,但LED不能。排查:將LED引腳直接接到卡座引腳,繞過金手指排線

5、若某個GPIO無法拉高,檢查GPIO配置,modem端需配置為TLMM_OWNER_MASTER,kernel端需配置為TLMM_OWNER_PERIPHERAL

6、廠商提供的代碼和本地平台可能會有版本差異性,一些宏定義、函數定義可能會不同,需要比對本地依賴庫中的函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM