LCD显示屏成功驱动起来的效果图如下所示:
下面是具体实现的步骤:
一、在kernel-3.10kernel-3.10/drivers/misc/mediatek/lcm下添加LCD屏驱动文件以及修改一些配置
1. 进入kernel-3.10/drivers/misc/mediatek/lcm文件夹
cd ~/mt6735/kernel-3.10/drivers/misc/mediatek/lcm
2. 新建一个文件夹,用于存放自己屏幕的驱动代码和Makefile文件
mkdir st7701_dsi_vdo_xind (dsi: display serial lnterface vdo:video xind)
3. 复制一份屏幕模板,在这个模板上添加自己屏幕参数,这里用的是旧屏作为模板:
cp -r ../otm8018b_dsi_vdo_xind/ .
4. 修改Makefile里面的内容:
# # Makefile for misc devices that really don't fit anywhere else. # include $(srctree)/drivers/misc/mediatek/Makefile.custom obj-y += st7701_dsi_vdo_xind.o
5. 将otm8018b_dsi_vdo_xind.c 更名为:st7701_dsi_vdo_xind.c
mv otm8018b_dsi_vdo_xind.c st7701_dsi_vdo_xind.c
6. 进入:st7701_dsi_vdo_xind.c
vi st7701_dsi_vdo_xind.c
7. 初始化参数:
将参考的初始化参数复制到这个结构体里面
static struct LCM_setting_table lcm_init_setting[] = { ...... {0x29,1, {0x00}}, {REGFLAG_DELAY, 50, {}}, {REGFLAG_END_OF_TABLE, 0x00, {}} };
8. lcm_compare_id 函数获取并且比较LCD屏的ID,return ((0x7701== id) ? 1:0); 系统根据返回值判断是否获取到LCD屏ID,有多个屏幕的时,可根据ID号切换显示。
static unsigned int lcm_compare_id(void) { int id=0; unsigned char buffer[4]; unsigned int array[16]; char id_high=0; char id_low=0; SET_RESET_PIN(1); MDELAY(10); SET_RESET_PIN(0); MDELAY(10); SET_RESET_PIN(1); MDELAY(120); array[0] = 0x00023700; dsi_set_cmdq(array, 1, 1); read_reg_v2(0xA1, &buffer[0], 2); id_high=buffer[0]; id_low=buffer[1]; id=(id_high<<8)| id_low; #ifdef BUILD_LK printf("st7701_fwvga_dsi_vdo_lcm_drv %s:0x%2x,0x%2x,0x%2x,0x%2x id=0x%x\n", __func__,buffer[0],buffer[1],buffer[2],buffer[3], id); #else printk("st7701_fwvga_dsi_vdo_lcm_drv %s:0x%2x,0x%2x,0x%2x,0x%2x id=0x%x\n", __func__,buffer[0],buffer[1],buffer[2],buffer[3], id); #endif return ((0x7701 == id) ? 1:0); // 读到LCD屏ID,返回值为1;否则,返回值为0 }
9. 修改LCM_DRIVER 名 以及.name = “名字” 使系统能够调用st7701_dsi_vdo_xind.c里面的函数
LCM_DRIVER st7701_dsi_vdo_xind_lcm_drv = { .name = "st7701_dsi_vdo_xind", .set_util_funcs = lcm_set_util_funcs, .get_params = lcm_get_params, .init = lcm_init, .suspend = lcm_suspend, .resume = lcm_resume, .compare_id = lcm_compare_id, .init_power = lcm_init_power, .resume_power = lcm_resume_power, .suspend_power = lcm_suspend_power, //.esd_check = lcm_esd_check, //.esd_recover = lcm_esd_recover, #if (LCM_DSI_CMD_MODE) .update = lcm_update, #endif };
以上修改好之后,保存并退出vi
10. 进入mt65xx_lcm_list.c 添加声明
vi ~/mt6735/kernel-3.10/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c
二、在lk/dev/lcm下添加LCD屏驱动文件以及修改一些配置
1. 进入~/mt6735/bootable/bootloader/lk/dev/lcm 目录下
cd ~/mt6735/bootable/bootloader/lk/dev/lcm
2. 在lk下添加LCD屏驱动文件以及修改一些配置与在kernel-3.10/drivers/misc/mediatek/lcm下类似。这里,我直接将修改好的文件从kernel-3.10/drivers/misc/mediatek/lcm/拷贝到lk/dev/lcm/
cp~/mt6735/kernel-3.10/drivers/misc/mediatek/lcm/st7701_dsi_vdo_xind/ ~/mt6735/bootable/bootloader/lk/dev/lcm
3. 因为是从/kernel-3.10/drivers/misc/mediatek/lcm/st7701_dsi_vdo_xind/复制过来的,Makefile与st7701_dsi_vdo_xind.c已经修改过了,这里不用重复修改。同样,要在lk/dev/lcm/mt65xx_lcm_list.c 文件添加st7701相关的声明。
vi lk/dev/lcm/mt65xx_lcm_list.c
4. 配置lk下的<project>.mk文件
vi ~/mt6735/bootable/bootloader/lk/project/p6s_65u_l1.mk
三、配置config
1. 打开配置文件:p6s_65u_l1_defconfig
vi ~/mt6735/kernel-3.10/arch/arm64/configs/p6s_65u_l1_defconfig
2. 在vi/vim中搜索LCM,方法是输入命令:/LCM
3. 我要修改CONFIG_CUSTOM_KERNEL_LCM 以及下面的CONFIG_LCM_HEIGHT CONFIG_LCM_WIDTH,但是不能直接在这里修改,直接在vi/vim下修改如果会影响到其他config,并且不会有提 醒,因此我要在menu界面下修改。
步骤是:1)新建一个文件
mkdir out1
2)输入指令
ARCH=arm64 make O=out1 p6s_65u_l1_defconfig
3)进入修改p6s_65u_l1_defconfig的界面:
ARCH=arm64 make O=out1 menuconfig //修改配置
4)用方向键选择:Device Drivers à Misc devices à MediaTek Properitary Configuration àCUSTOM_KERNEL_LCM。当出现如下界面,在输入框内输入屏幕驱动所在的文件的文件名,例如:
5)再找到修改屏幕大小也就是屏幕分辨率的选项:
6)修改好之后保存,输入p6s_65u_l1_defconfig,选择OK 保存修改,之后退出:
7) 经过以上的修改,所有的配置都保存在p6s_65u_l1_defconfig,将新的配置文件p6s_65_l1_defconfig复制到~/mt6735/kernel-3.10/arch/arm64/configs 替换掉旧的配置文件p6s_65u_l1_defconfig 。
cp ~/mt6735/kernel-3.10/out1/p6s_65u_l1_defconfig ~/mt6735/kernel-3.10/arch/arm64/configs/
8)最后,编译系统
make 2>&1 | tee build.log
四、需要了解更多内容,请点击:在MT6735平台下驱动LCD屏