分类 Android 下的文章

使用 qcom 整体烧录镜像,步骤繁琐,比较花时间,如果只是修改了驱动和设备树,那么只需要烧录内核即可,可以使用 fastboot 迅速验证。

1. 生成 kernel

make bootimage -j
make dtboimage -j

2. 准备旧的镜像文件和脚本

  • boot, dtbo, system, vendor, vbmeta 这几个镜像是需要的
  • 脚本文件
adb wait-for-devices
adb reboot bootloader
fastboot devices
fastboot flash boot boot.img
fastboot flash dtbo dtbo.img
fastboot flash vbmeta vbmeta.img
fastboot flash system system.img
fastboot flash vendor vendor.img
fastboot reboot

3. 把新的 kernel 对应的 boot 和 dtbo 代替文件夹里面相应的文件,然后执行脚本即可。

转自: https://www.cnblogs.com/lialong1st/p/9952077.html

CPU:RK3288

系统:Android 5.1

触摸IC:GT911

1、在 menuconfig 或者 rockchip_defconfig 中支持触摸屏。具体用哪种方式需要结合编译方法。

按照瑞芯微提供的编译方式,则修改 rockchip_defconfig,这种方式在make前,需要执行 make rockchip_defconfig,生成 .config 文件。

path:kernel/arch/arm/configs/rockchip_defconfig

CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_GT9XX=y

只执行make的话,就要在make menuconfig中修改,保存后生成 .config 文件。

Device Drivers  --->
    Input device support  --->
         [*]   Touchscreens  --->
            <*>   Goodix touch screen gt9xx support for rockchip based platform

2、修改触摸屏分辨率。

path:kernel/drivers/input/touchscreen/gt9xx/gt9xx.h

// 下面有两种定义分辨率的方式,任选一种
#define GTP_CUSTOM_CFG        1     
        ... ...
#define GTP_1024X768
        ... ...
#if GTP_CUSTOM_CFG
    #ifdef GTP_1024X768
          #define GTP_MAX_HEIGHT      768
          #define GTP_MAX_WIDTH     1024
    #else
         #define GTP_MAX_HEIGHT      320
          #define GTP_MAX_WIDTH     480
    #endif
  // 触摸屏中断触发信号
  #define GTP_INT_TRIGGER      0          // 0: Rising 1: Falling
#else
  #define GTP_MAX_HEIGHT   4096
  #define GTP_MAX_WIDTH    4096
  #define GTP_INT_TRIGGER  1
#endif        

3、确认触摸屏Sensor-ID,有下面两种方式

(1)根据硬件配置,需要咨询供应商。

//*************************** PART2:TODO define **********************************
// STEP_1(REQUIRED): Define Configuration Information Group(s)
// Sensor_ID Map:
/* sensor_opt1 sensor_opt2 Sensor_ID
    GND         GND          0 
    VDDIO       GND          1 
    NC          GND          2 
    GND         NC/300K      3 
    VDDIO       NC/300K      4 
    NC          NC/300K      5 
*/

(2)内核运行时的log可以看出来

// 获取 sensor_id
ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1);
if (SUCCESS == ret)    // 获取 sensor_id 成功
{
    // sensor_id 超出范围
    if (sensor_id >= 0x06)
    {
        GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id);
        ts->pnl_init_error = 1;
        return -1;
    }
}
else    // 获取 sensor_id 失败
{
    GTP_ERROR("Failed to get sensor_id, No config sent!");
    ts->pnl_init_error = 1;
    return -1;
}
// 成功后打印 sensor_id
GTP_INFO("Sensor_ID: %d", sensor_id);

4、在dts文件中,修改触摸屏的硬件参数。

// i2c接口
&i2c4 {
    // 使能
    status = "okay";
    // 设备地址(记得除二)
    ts@5d{
        compatible = "goodix,gt9xx";
        reg = <0x5d>;
        // 复位IO
        goodix,rst-gpio = <&gpio7 GPIO_B2 GPIO_ACTIVE_HIGH>; 
        // 中断IO
        goodix,irq-gpio = <&gpio7 GPIO_B1 IRQ_TYPE_LEVEL_LOW>;
        pinctrl-names = "default";
        // 中断IO默认上拉
        pinctrl-0 = <&gpio7_b1>;
        // 触摸屏配置参数,需要供应商提供,group0-group5,根据Sensor-ID决定,若ID=4,则使用goodix,cfg-group4
        goodix,cfg-group0 = [
            63 40 01 E0 01 05 35 00 01 08 28 05 50 32 03 05 00 00 00 00
            00 00 00 14 16 18 10 8C 20 08 17 15 31 0D 00 00 02 9A 04 24
            00 00 00 00 00 03 64 32 00 00 00 0F 94 94 45 02 07 00 00 04
            8D 13 00 5C 1E 00 3C 30 00 28 4C 00 1D 78 00 1D 00 00 00 00
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
            00 00 00 00 00 00 00 00 00 00 00 00 02 04 06 08 0A 0C 0E 10
            FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00
            00 00 00 02 04 06 08 0A 0C 0F 10 12 13 14 FF FF FF FF FF FF
            FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00
            00 00 00 00 C9 01];
        };
};

此时已配置完毕

若出现触摸方向x、y反了,可以联系供应商改配置文件,也可以在头文件中打开交换x、y坐标的宏

宏生效后,会在触摸按下的函数 gtp_touch_down 中,交换x、y坐标

#define GTP_CHANGE_X2Y        1       //swap x y
#if GTP_CHANGE_X2Y
    GTP_SWAP(x, y);
#endif

若出现触摸方向x、y镜像了,可以联系供应商改配置文件,也可以在触摸按下的函数 gtp_touch_down 中,修改x、y坐标

// abs_x_max abs_y_max 分别是x y方向的最大值
// x 方向镜像
x = ts->abs_x_max - x;
// y 方向镜像
y = ts->abs_y_max - y;

若出现触摸不准,,触摸跳点等问题,则需要联系供应商查看硬件或者修改配置参数。

转自: https://www.ebaina.com/articles/140000004356

声明:因为在开发过程中不同设备会搭载同一芯片,不同设备会有各种不同的硬件设备,因此本文移植的gt911驱动也是以动态加载的方式载入内核的。

gt9xx是一款很常用的触摸屏ic,网上对它在安卓和stm32平台上的使用调试教程较多,但是在海思平台的调试教程较少,下面记录一些我自己移植gt9xx安卓驱动碰到的问题。

开始调试时给到的资料有一份gt9xx的安卓驱动代码,一份移植说明书,一份gt9xx的数据手册(网上都有)。

- 阅读剩余部分 -

转自: https://blog.csdn.net/xubin341719/article/details/7881735

关键词:android 按键 矩阵按键 AD按键

平台信息:

内核:linux2.6/linux3.0

系统:android/android4.0

平台:S5PV310(samsung exynos4210)

作者:xubin341719(欢迎转载,请注明作者)

一、硬件部分:

1、矩阵按键、IO按键、AD按键

这个知识相对来说比较简单,不过上次真有一个网友不太清楚这个。所以这个基础部分我们在这里也说一下。

- 阅读剩余部分 -

转自: https://blog.csdn.net/xubin341719/article/details/7678053

参考:http://blog.chinaunix.net/uid-22174347-id-1786941.html

==========================================================

开发环境

编译系统 :fedora9

编译器 :arm-linux-4.4.3

主控芯片 :S3C2440

开发板 :mini2440

==========================================================

一、电阻式触摸屏工作原理 二、 S3C2440 电阻式触摸屏接口、内部ADC结构 三、Linux输入子系统(InputSubsystem) 四、mini2440触摸屏驱动分析

==========================================================

(这部分转自:http://blog.chinaunix.net/uid-22174347-id-1786941.html 文章写得很好)

四、mini2440触摸屏驱动分析

1、硬件原理图分析

S3c2440芯片内部触摸屏接口与ADC接口是集成在一起的,硬件结构原理图请看:S3C2440上ADC驱动实例开发讲解中的图,其中通道7(XP或AIN7)作为触摸屏接口的X坐标输入,通道5(YP或AIN5)作为触摸屏接口的Y坐标输入。在"S3C2440上ADC驱动实例开发讲解"中,AD转换的模拟信号是由开发板上的一个电位器产生并通过通道1(AIN0)输入的,而这里的模拟信号则是由点触触摸屏所产生的X坐标和Y坐标两个模拟信号,并分别通过通道7和通道5输入。S3c2440提供的触摸屏接口有4种处理模式,分别是:正常转换模式、单独的X/Y位置转换模式、自动X/Y位置转换模式和等待中断模式,对于在每种模式下工作的要求,请详细查看数据手册的描述。本驱动实例将采用自动X/Y位置转换模式和等待中断模式。

- 阅读剩余部分 -

转自: https://blog.csdn.net/xubin341719/article/details/7678035

参考:http://blog.chinaunix.net/uid-22174347-id-1786941.html

==========================================================

开发环境

编译系统 :fedora9

编译器 :arm-linux-4.4.3

主控芯片 :S3C2440

开发板 :mini2440

==========================================================

一、电阻式触摸屏工作原理 二、 S3C2440 电阻式触摸屏接口、内部ADC结构 三、Linux输入子系统(InputSubsystem) 四、mini2440触摸屏驱动分析

==========================================================

三、Linux输入子系统(InputSubsystem)

1,linux输入子系统简述

其实驱动这部分大多还是转载别人的,linux输入子系统后面再详细分析。

在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(InputCore)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。所以这使得我们输入设备的驱动部分不在用关心对设备文件的操作,而是要关心对各硬件寄存器的操作和提交的输入事件。下面用图形来描述一下这三者的关系吧!

- 阅读剩余部分 -

转自: https://blog.csdn.net/zgkxzx/article/details/56980769

前言

gslx680电容触摸屏是一种目前Android嵌入式设备中比较常用的触摸屏类型。这里我们以Exynos4412为Android bsp平台,移植一款gslx680电容触摸屏。 关于电容触摸屏的原理,这里不进行讲解,不明白的,可以参照一下博客:http://blog.csdn.net/xubin341719/article/details/7820492 这里只从实际工程出发,讲解移植过程。谢谢~~

- 阅读剩余部分 -

转自: https://blog.csdn.net/loongembedded/article/details/72674115

  1. 8937 lk采用8952的。

/device/qcom/msm8937_64/BoardConfig.mk 下面可看出来

BOOTLOADER_PLATFORM := msm8952 # use msm8937LK configuration

2.8937 configs文件用 kernel\msm-3.18\arch\arm64\configs 目录下的

3.user版本用 msm8937-perf_defconfig 文件,userdebug 和 eng 版本用 msm8937_defconfig

    #----------------------------------------------------------------------
    # Compile Linux Kernel
    #----------------------------------------------------------------------
    ifeq ($(KERNEL_DEFCONFIG),)
       ifeq ($(TARGET_BUILD_VARIANT),user)
         KERNEL_DEFCONFIG := msm8937-perf_defconfig
       else
         KERNEL_DEFCONFIG := msm8937_defconfig
       endif
    endif

- 阅读剩余部分 -

转自: https://blog.csdn.net/zhahaobing2017/article/details/52951159

android屏幕启动流程

点亮一个新屏幕,下面以8909-x26的屏幕为例。

启动引导部分:

一、添加对应的.h文件

首先添加一个.h头文件,命名为panel_ili9806e_fwvga_hsd_helitai_x26_video.h,该文件放在路径/bootable/bootloader/lk/dev/gcdb/include/下面。因为这里包含了各种型号的屏幕的头文件,也就是初始化代码,并且放在了启动引导目录。根据命名,知道该屏幕的IC(芯片)是ili9806e,屏幕分辨率是fwvga,玻璃是HSD,模组厂是helitai(合力泰)。

屏幕工作的关键是芯片、玻璃、模组厂!

在头文件里面会对屏幕进行初始化,如backlight(背光),lane(通道),color(颜色),timing_information(定时)等。

/*---------------------------------------------------------------------------*/

/* Backlight setting                                                         */

/*---------------------------------------------------------------------------*/

static struct backlight ili9806e_fwvga_hsd_helitai_x26_video_backlight = {

1, 1, 4095, 100, 1, "PMIC_8941"

};

/*---------------------------------------------------------------------------*/

/* Lane configuration                                                        */

/*---------------------------------------------------------------------------*/

static struct lane_configuration ili9806e_fwvga_hsd_helitai_x26_video_lane_config = {

2, 1, 1, 1, 0, 0, 0

};

/*---------------------------------------------------------------------------*/

/* Panel color information                                                   */

/*---------------------------------------------------------------------------*/

static struct color_info ili9806e_fwvga_hsd_helitai_x26_video_color = {

24, 0, 0xff, 0, 0, 0

};

static char ili9806e_fwvga_hsd_helitai_x26_video_on_cmd0[] = {

0x06, 0x00, 0x39, 0xC0,

0xFF, 0xFF, 0x98, 0x06,

0x04, 0x01, 0xFF, 0xFF,

};

......

二、oem_penel.c文件添加自己的新屏幕(路径:bootable/bootloader/lk/target/msm8909_x26_q1/

(1).首先添加屏幕初始化的头文件”panel_ili9806e_fwvga_hsd_helitai_x26_video.h“,即:

#include “include/panel_ili9806e_fwvga_hsd_helitai_x26_video.h”.

(2).在枚举类型中添加自己的新屏幕:

其中该枚举类型在文件mipi_panel_reg_id.h中(路径:./bootable/bootloader/lk/platform/msm_shared/include/

enum {

......

ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL,//add your panel.

UNKNOWN_PANEL

};

(3).在函数init_panel_data()中,添加自己的板子的case语句,即新屏幕的数据初始化。

case ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL:

panelstruct->paneldata          = &ili9806e_fwvga_hsd_helitai_x26_video_panel_data;

panelstruct->panelres           = &ili9806e_fwvga_hsd_helitai_x26_video_panel_res;

panelstruct->color              = &ili9806e_fwvga_hsd_helitai_x26_video_color;

panelstruct->videopanel         = &ili9806e_fwvga_hsd_helitai_x26_video_video_panel;

panelstruct->commandpanel       = &ili9806e_fwvga_hsd_helitai_x26_video_command_panel;

panelstruct->state              = &ili9806e_fwvga_hsd_helitai_x26_video_state;

panelstruct->laneconfig         = &ili9806e_fwvga_hsd_helitai_x26_video_lane_config;

panelstruct->paneltiminginfo    = &ili9806e_fwvga_hsd_helitai_x26_video_timing_info;

panelstruct->panelresetseq      = &ili9806e_fwvga_hsd_helitai_x26_video_reset_seq;

panelstruct->backlightinfo      = &ili9806e_fwvga_hsd_helitai_x26_video_backlight;

pinfo->mipi.panel_cmds          = ili9806e_fwvga_hsd_helitai_x26_video_on_command;

pinfo->mipi.num_of_panel_cmds   = ARRAY_SIZE(ili9806e_fwvga_hsd_helitai_x26_video_on_command);

memcpy(phy_db->timing,ili9806e_fwvga_hsd_helitai_x26_video_timings, TIMING_SIZE);

pinfo->mipi.signature = ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_SIGNATURE;

break;

(4).在函数oem_panel_select()中,必须让控制板的id选择自己新添加的,否则,开机屏幕不亮。

case HW_PLATFORM_QRD:

if (lcm_gpio_id == 1) {

panel_id = ILI9806E_FWVGA_HSD_HUASHI_VIDEO_PANEL;

} else {

panel_id = ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL;//add your panel

}

break;

到此,lk(little kernel)部分,屏幕相关的工作就完成了!

程序执行流程:

(1)当按下开机键,程序自然就是从main函数开始执行,不过main是C 语言的叫法。(具体可以参见BIOS过程)。

(2)程序运行到APP_START(aboot)

.init = aboot_init,

APP_END

就会调用aboot_init()函数。aboot意为“引导”。

(2)引导的时候自然有屏幕的启动和初始化,aboot_init()函数调用target_display_init()函数,条件是DISPLAY_SPLASH_SCREEN为1。

(3)在函数target_display_init()最后,ret = gcdb_display_init();程序自然跳转到函数gcdb_display_init()

(4)在gcdb_display_init中首先调用oem_panel_select()函数,然后又跳转到oem_panel_select函数。

hw_id的值由board_hardware_id()返回,返回了11,然后进入qrd路线。107行知lcm_gpio_id=0,所以在else分支(lcm_gpio_id =0)下添加自己的屏幕,即将panel_id设置为ILI9806E_FWVGA_HSD_HELITAI_x26

_VIDEO_PANEL.(panel_id = ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL)。

(5)oem_panel_select()函数最后return init_panel_data(),程序进入init_panel_data(),

(6)在init_panel_data()中已经添加了自己的case语句,根据第109行,Func:oem_panel_select panel_id = 17 ,说明,已经选择了添加的新屏幕来初始化,因为枚举变量中自己新添加的屏幕(ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL)刚好是第17个。这样panel_ili9806e_fwvga_hsd_helitai_x26_video.h文件参数全部用到。最后返回pan_type.

(7)程序继续在oem_panel_select()中,也返回pan_type,然后退出oem_panel_select()函数。回到gcdb_display_init()中,接收了pan_type,所以日志117行打印出pan_type是PANEL_TYPE_DSI。

(8)在gcdb_display_init中自然初始化DSI下的项目,如:

panel.fb.width,

panel.fb.height,

panel.fb.stride,

panel.fb.bpp

...

(9)第117行,display_enable = 1,ret = 0;gcdb_display_init()返回,说明屏幕bootloader部分完成,新屏幕可用,成功返回0.然后回到函数target_display_init()。

(10)第118行, in function:target_display_init,line:350,ret = 0.说明 target_display_init函数也成功结束。

(11)到此开机中屏幕的点亮结束了。

编译bootloader: make aboot -j6

烧写bootloader: fastboot flash aboot emmc_appsboot.mbn

附log:

......

106 [1450][1450]#mipi_get_lcm_pin_id().pin[8]_status = 0

107 ------ Func:oem_panel_select lcm_gpio_id = 0 ----------

108 hw_id = 11

109 -Func:oem_panel_select    panel_id = 17 -------

110 in function:gcdb_display_init,line:379,panel_type is PANEL_TYPE_DSI

111 in function:gcdb_display_init,line:386,panel init successfully!

112 [1540][1540] Config MIPI_VIDEO_PANEL.

113 [1690][1690] Panic Lut0 la90000 Lut1 ff Robest 0

114 [1700][1700] Turn on MIPI_VIDEO_PANEL.

115 [1720][1720] Video lane tested successfully

116 in function:gcdb_display_init,line:419,panel_type is PANEL_TYPE_DSI

117 display_enable = 1,ret = 0

118 in function:target_display_init,line:350,ret = 0

......

内核部分:

三、 (1)在路径kernel/arch/arm/boot/dts/msm8909_x26_q1下添加内核配置文件: dsi-panel-ili9806e-fwvga-hsd-helitai-x26-video.dtsi.

该文件是屏幕的配置文件,屏幕休眠唤醒时会走此文件。配置项目包括:

mdss-dsi-h-back-porchmdss-dsi-h-front-porchmdss-dsi-h-pulse-widthmdss-dsi-h-sync-skew等。

具体可参考文件:kernel/Documentation/devicetree/bindings/fb

其中在文件开头有一变量 dsi_ili9806e_fwvga_hsd_hlt_x26_vid,其值必须和启动引导部分的结构体ili9806e_fwvga_hsd_helitai_x26_video_panel_data的第一个成员相同。

引导部分和内核相关联就是这个panel_node_id, 这样屏幕待机之后唤醒就会找到引导时候的初始化屏幕路线。引导部分和内核部分的桥梁就是panel_node_id(变量dsi_ili9806e_fwvga_hsd_hlt_x26_vid), 他写进cmd-line,最后传给内核。

(2)在文件msm8909-mdss-panels.dtsi添加头文件:

即添加一行代码:#include "dsi-panel-ili9806e-fwvga-hsd-helitai-x26-video.dtsi"

其中该文件是屏幕的配置文件

(3)添加自己的屏幕(注意语法,不要漏掉分号):

&dsi_ili9806e_fwvga_hsd_hlt_x26_vid {

       qcom,cont-splash-enabled;

};

(4)将id设置为自己的id,这一步很重要,否则,开机屏幕正常,但是一旦休眠,再次唤醒手机,手机就是白屏,因为,唤醒虽然走的是开机的初始化路线,但是在这里却进入了另一种型号的屏幕了!

&mdss_dsi0 {

/*qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_video>;*/

qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_hsd_hlt_x26_vid>;//在这一行改为自己的屏幕

pinctrl-names = "mdss_default", "mdss_sleep";

  ......

};

到此,内核部分修改完成!

编译:make bootimage -j6

烧写: sudo fastboot flash boot boot.img