如何向android添加内核驱动模块

如何向android添加内核驱动模块,第1张

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在该文件中可见)

20220520给MT6765的android8.1系统增加TP驱动ILI9881H

2022/5/20 18:54

1、内核的config

Z:\android_mtk_o1_mp1\kernel-4.9\arch\arm64\boot\dts\mediatek\k62v1_64_bsp.dts

&i2c3 {

ext_buck_lp4@57 {

regulator-name ="ext_buck_vdd2"

regulator-min-microvolt = <300000>

regulator-max-microvolt = <1300000>

vsel_pin = <0>

}

ext_buck_lp4x@50 {

regulator-name ="ext_buck_vddq"

regulator-min-microvolt = <300000>

regulator-max-microvolt = <1300000>

vsel_pin = <1>

}

}

&i2c0 {

        #address-cells = <1>

        #size-cells = <0>

        clock-frequency = <400000>

        mediatek,use-open-drain

        ili_touch@41{

                compatible= "mediatek,ili_touch"

                reg= <0x41>

                status ="okay"

        }

}

&i2c6 {

ext_buck_vgpu@55 {

regulator-name ="ext_buck_vgpu"

regulator-min-microvolt = <300000>

regulator-max-microvolt = <1300000>

vsel_pin = <2>

}

}

/* TOUCH start */

&touch {

tpd-resolution = <720 1600>

use-tpd-button = <0>

tpd-key-num = <3>

tpd-key-local= <139 172 158 0>

tpd-key-dim-local = <90 883 100 40 230

883 100 40 370 883 100 40 0 0 0 0>

tpd-max-touch-num = <5>

tpd-filter-enable = <1>

tpd-filter-pixel-density = <146>

tpd-filter-custom-prameters = <0 0 0 0 0 0 0 0 0 0 0 0>

tpd-filter-custom-speed = <0 0 0>

pinctrl-names = "default", "state_eint_as_int", "state_eint_output0",

"state_eint_output1", "state_rst_output0", "state_rst_output1"

pinctrl-0 = <&ctp_pins_default>

pinctrl-1 = <&ctp_pins_eint_as_int>

pinctrl-2 = <&ctp_pins_eint_output0>

pinctrl-3 = <&ctp_pins_eint_output1>

pinctrl-4 = <&ctp_pins_rst_output0>

pinctrl-5 = <&ctp_pins_rst_output1>

status = "okay"

}

&pio {

ctp_pins_default: eint0default {

}

ctp_pins_eint_as_int: eint@0 {

pins_cmd_dat {

pinmux = <PINMUX_GPIO0__FUNC_GPIO0>

slew-rate = <0>

bias-disable

}

}

ctp_pins_eint_output0: eintoutput0 {

pins_cmd_dat {

pinmux = <PINMUX_GPIO0__FUNC_GPIO0>

slew-rate = <1>

output-low

}

}

ctp_pins_eint_output1: eintoutput1 {

pins_cmd_dat {

pinmux = <PINMUX_GPIO0__FUNC_GPIO0>

slew-rate = <1>

output-high

}

}

ctp_pins_rst_output0: rstoutput0 {

pins_cmd_dat {

pinmux = <PINMUX_GPIO174__FUNC_GPIO174>

slew-rate = <1>

output-low

}

}

ctp_pins_rst_output1: rstoutput1 {

pins_cmd_dat {

pinmux = <PINMUX_GPIO174__FUNC_GPIO174>

slew-rate = <1>

output-high

}

}

}

/* TOUCH end */

Z:\android_mtk_o1_mp1\kernel-4.9\arch\arm64\configs\k62v1_64_bsp_debug_defconfig

Z:\android_mtk_o1_mp1\kernel-4.9\arch\arm64\configs\k62v1_64_bsp_defconfig

CONFIG_INPUT_TOUCHSCREEN=y

CONFIG_TOUCHSCREEN_MTK=y

CONFIG_TOUCHSCREEN_MTK_GT1151=y

CONFIG_GT1151_FIRMWARE="firmware2"

CONFIG_GT1151_CONFIG="config16"

CONFIG_GTP_DRIVER_SEND_CFG=y

CONFIG_GTP_CUSTOM_CFG=y

CONFIG_GTP_AUTO_UPDATE=y

CONFIG_GTP_REQUEST_FW_UPDATE=y

CONFIG_GTP_CREATE_WR_NODE=y

CONFIG_GTP_POWER_CTRL_SLEEP=y

修改为:

CONFIG_INPUT_TOUCHSCREEN=y

CONFIG_TOUCHSCREEN_MTK=y

CONFIG_TOUCHSCREEN_MTK_GT1151=n

CONFIG_TOUCHSCREEN_MTK_ILI9881=y

CONFIG_GT1151_FIRMWARE="firmware2"

CONFIG_GT1151_CONFIG="config16"

CONFIG_GTP_DRIVER_SEND_CFG=y

CONFIG_GTP_CUSTOM_CFG=y

CONFIG_GTP_AUTO_UPDATE=y

CONFIG_GTP_REQUEST_FW_UPDATE=y

CONFIG_GTP_CREATE_WR_NODE=y

CONFIG_GTP_POWER_CTRL_SLEEP=y

2、TP文件:

整个目录

Z:\android_mtk_o1_mp1\kernel-4.9\drivers\input\touchscreen\mediatek\new_tddi_9881x\Makefile

Z:\android_mtk_o1_mp1\kernel-4.9\drivers\input\touchscreen\mediatek\Kconfig

source "drivers/input/touchscreen/mediatek/NT36xxx/Kconfig"

config TOUCHSCREEN_MTK_ILI9881

        bool "ILI9881 for Mediatek package"

        default y

        help

          Say Y here if you have ILI9881 touch panel

          if unsure, say N.

          To compile this dirver as a module,choose M here: the

          module will be called.

endif

Z:\android_mtk_o1_mp1\kernel-4.9\drivers\input\touchscreen\mediatek\Makefile

obj-y  +=  tpd_misc.o

obj-y  +=  tpd_setting.o

obj-$(CONFIG_TOUCHSCREEN_MTK_SOLOMON) +=  SOLOMON/

obj-$(CONFIG_TOUCHSCREEN_MTK_FOCALTECH_TS) +=  focaltech_touch/

obj-$(CONFIG_TOUCHSCREEN_MTK_GT1151) +=  GT1151/

obj-$(CONFIG_TOUCHSCREEN_MTK_GT911) +=  GT911/

obj-$(CONFIG_TOUCHSCREEN_MTK_GSLX680) +=  gslX680/

obj-$(CONFIG_TOUCHSCREEN_MTK_NT36xxx) +=  NT36xxx/

obj-$(CONFIG_TOUCHSCREEN_MTK_ILI9881)  += new_tddi_9881x/

一、 驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录; 2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项; 3. 在目录的 Makefile 文件中增加对新源代码的编译条目。 bq27501驱动编译到内核中具体步骤如下: 1. 先将驱动代码bq27501文件夹复制到 ti-davinci/drivers/ 目录下。 确定bq27501驱动模块应在内核源代码树中处于何处。 设备驱动程序存放在内核源码树根目录 drivers/ 的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。 a. 字符设备存在于 drivers/char/ 目录下 b. 块设备存放在 drivers/block/ 目录下 c. USB 设备则存放在 drivers/usb/ 目录下。 注意: (1) 此处的文件组织规则并非绝对不变,例如: USB 设备也属于字符设备,也可以存放在 drivers/usb/ 目录下。 (2) 在 drivers/char/ 目录下,在该目录下同时存在大量的 C 源代码文件和许多其他目录。所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。 (3) bq27501的驱动是属于字符设备驱动类别,虽然驱动相关的文件只有两个,但是为了方面查看,将相关文件放在了bq27501的文件夹中。在drivers/char/目录下增加新的设备过程比较简单,但是在drivers/下直接添加新的设备稍微复杂点。所以下面首先给出在drivers/下添加bq27501驱动的过程,然后再简单说明在drivers/char/目录下添加的过程。 2. 在/bq27501下面新建一个Makefile文件。向里面添加代码: obj-$(CONFIG_BQ27501)+=bq27501.o 此时,构建系统运行就将会进入 bq27501/ 目录下,并且将bq27501.c 编译为 bq27501.o 3. 在/bq27501下面新建Kconfig文件。添加代码: menu "bq27501 driver" config BQ27501 tristate"BQ27501" default y ---help--- Say 'Y' here, it will be compiled into thekernelIf you choose 'M', it will be compiled into a module named asbq27501.ko. endmenu 注意:help中的文字不能加回车符,否则make menuconfig编译的时候会报错。 4. 修改/drivers目录下的Kconfig文件,在endmenu之前添加一条语句‘source drivers/bq27501/Kconfig’ 对于驱动程序,Kconfig 通常和源代码处于同一目录。 若建立了一个新的目录,而且也希望 Kconfig 文件存在于该目录中的话,那么就必须在一个已存在的 Kconfig 文件中将它引入,需要用上面的语句将其挂接在 drivers 目录中的Kconfig 中。 5. 修改/drivers目下Makefile文件,添加‘obj-$(CONFIG_BQ27501) +=bq27501/’。这行编译指令告诉模块构建系统在编译模块时需要进入 bq27501/ 子目录中。此时的驱动程序的编译取决于一个特殊配置 CONFIG_BQ27501 配置选项。 6. 修改arch/arm目录下的Kconfig文件,在menu "Device Drivers……endmenu"直接添加语句 source "drivers/bq27501/Kconfig"


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11960024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存