zoukankan      html  css  js  c++  java
  • 将新的驱动源文件添加进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、厂商提供的代码和本地平台可能会有版本差异性,一些宏定义、函数定义可能会不同,需要比对本地依赖库中的函数。

  • 相关阅读:
    C#实现带阴历显示的日期代码
    ASP.NET实现支付宝接口功能
    网站添加手机短信功能
    ASP.NET支付宝扫码即时到账支付开发流程(序言)
    ASP.NET支付宝扫码即时到账支付开发流程(下)
    ASP.NET支付宝扫码即时到账支付开发流程(上)
    如何把自己写的程序加入到开机启动项(Windows)
    C#操作注册表
    重温SQL——行转列,列转行
    Unity Hub破解
  • 原文地址:https://www.cnblogs.com/yiru/p/2915779.html
Copyright © 2011-2022 走看看