标签 aosp 下的文章

今天调试广和通的串口,发现发送没有问题,接收都是乱码。

和供应商联系了之后,解决了这个问题。

确认是否是串口休眠引起的问题。

  1. echo -1 > /sys/bus/platform/devices/7af0000.uart/power/autosuspend_delay_ms 执行这个命令,关闭串口自动休眠。
  2. 重新测试,发现接收正常了,没有乱码。

自动设置串口不休眠。

  1. SQ80X-Android10/kernel/msm-4.9/drivers/tty/serial/msm_serial_hs.c 修改这个文件,

    -       pm_runtime_set_autosuspend_delay(uport->dev, 100);
    +       pm_runtime_set_autosuspend_delay(uport->dev, -1);
  2. 重新编译测试。

准备底包

  1. 把供应商给出的出厂镜像解压
  2. 创建自己的烧录文件夹 customer_sw
  3. 把厂商文件夹中的 rawprogram0_update_original.xml 复制到 customer_sw 中,把厂商提供的 ptool.py 也放到 customer_sw 中。
  4. 安装 python 2.7.6
  5. 运行 python ./ptool.py -x rawprogram0_update_original.xml 生成一系列的文件。
  6. 生成文件中 rawprogram0.xmlpatch0.xml 就是 qfil 需要使用的。
  7. 从厂商文件夹中复制 prog_emmc_firehose_8917_ddr.mbncustomer_sw 中.

指定烧录镜像

rawprogram0.xml 中所有的 ap 侧需要用的可以保留, bp 侧的直接 filename="" 这样即可。 注意:

  1. 一般 persist.img 这个可以不用。
  2. 如果有某些特殊修改,供应商会提供 devcfg,那么 rawprogram0.xml 中对应条目需要指明 filename。

准备镜像

rawprogram0.xml 中所有 filename 没有留空的,相应的镜像从 out 文件夹下面复制到 customer_sw 中。

qfil 配置

  1. download configuration 中,勾选 reset after download,取消勾选 erase all before download
  2. 选择 flat build
  3. select programmer 中选择 prog_emmc_firehose_8917_ddr.mbn
  4. load xml 中 rawprogrammer 中选择 rawprogram0.xml
  5. load xml 中 patch 中选择 patch0.xml
  6. download

编译环境配置问题。

  1. 不是输入 source build/envsetup.sh 而是 source build/envsetup.sh SQ808_CN_10_00
  2. 然后再 lunch sq80x_64-userdebug

dts 配置问题。

  1. out/target/product/sq80x_64/obj/KERNEL_OBJ/arch/arm64/boot/dts/qcom/ 这个文件夹删除掉。
  2. kernel/msm-4.9/arch/arm64/boot/dts/qcom/Makefile 删除 dts-dirs += sq808-fttest

类似的核心芯片情况下,下载烧录 分包 的时候都是使用的 qpst,具体过程如下:

  1. 检查端口不是 9008
  2. flat build
  3. 加载 prog_emmc_firehose_8917_ddr.mbn
  4. 加载 xml, 这里注意,移远是 rawprogram_unsparse.xml, 广和通是 rawprogram0_update.xml,加载 patch0.xml
  5. download

备注

  • 如果广和通整包下载,好像是选择 rawprogram_unsparse.xml
  • 广和通编译的时候,也不是 source build/envsetup.sh 而是 source build/envsetup.sh SQ808_CN_10_00
  • 然后使用 ptool.py 对应的文档来做。相应的 xml 文件可以和 移远的对照改动。
  • 广和通的分包脚本在 win 下可以运行,在 ubuntu 下面有问题。
  • 如果开机只能进入fastboot, 基本可以认为是 boot.imgdtbo.img 有问题。

getevent -l

可以查看 kernel 具体上报上来的按键信息

查看按键有没有注册中断。

  1. cat proc/interrupts | grep home 这个可以看 home 键有没有注册中断。
  2. cat proc/interrupts | grep volume_up 这个可以对照着看这个按键中断注册的情况。

查看设备树中有没有相应的按键节点

ls sys/firmware/devicetree/base/soc/gpio_keys/ 可以查看所有的按键节点。

查看 bid

getprop | grep bid

核对 dtsi 文件

确保 home 按键是在 gpio_key 下面的子节点。

参考:

【实习周记】Android getevent.c源码分析
https://blog.csdn.net/LeeDuoZuiShuai/article/details/97536678

android Input子系统分析
https://blog.csdn.net/xiaoxiaoyu1107/article/details/39400199#overview
android Input子系统分析(内核层->android系统层)
https://www.cnblogs.com/MMLoveMeMM/articles/4119812.html

确定 dts 文件

  1. 直接从串口打印的 log 里面,搜索 Machine,正常就会出现后面的机器标识了,我这边是 QRD
    [    0.000000] OF: fdt:Machine model: QRD
  2. SC200R_Android10.0_R04_r023/kernel/msm-4.9/arch/arm64/boot/dts/qcom$ 下面搜索 QRD
    $ grep -R "\"QRD\""
    qm215-qrd-overlay.dts:  model = "QRD";
    sdm439-qrd-overlay.dts: model = "QRD";
    qcm2150-qrd-overlay.dts:        model = "QRD";
    sdm632-qrd-overlay.dts: model = "QRD";
    sdm429-qrd-overlay.dts: model = "QRD";
  3. 在怀疑的 dts 里面的 model 后面增加一些字符,然后重新编译 kernel,查看打印 log。就能确定到底是哪一个 dts 了,我的如下:
    [    0.000000] OF: fdt:Machine model: QRD qrm215-qrd-overlay

最终的 dts 文件内容,只能通过反编译 fdt 才能知道了。

  1. android 启动后,通过 adb 获取 fdt 文件。 adb pull /sys/firmware/fdt ./
  2. 把 aosp 源码中的 dtc 文件复制出来, ./prebuilts/misc/linux-x86/dtc/dtc
  3. 把 fdt 转为 dts 文件,就可以查看最终的 dts 了。 dtc -I dtb -O dts fdt -o tmp.dts

查看 dts 的包含关系。

使用 SC200R_Android10.0_R04_r023/kernel/msm-4.9/arch/arm64 下面的 DeviceTreeMap.py 可以解析 dts 的相互包含关系。

参考

高通平台dts的匹配过程分析
https://blog.csdn.net/armfpga123/article/details/54313700

高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)
https://blog.csdn.net/aiku969/article/details/79878072

如何找到kernel所用的dtsi
https://blog.csdn.net/u013308744/article/details/50204693

Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953实例分析篇)
https://radia.blog.csdn.net/article/details/76574727

Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)
https://radia.blog.csdn.net/article/details/70800076

linux/android代码中对于不同项目中conf、dts、defconfig文件的处理方法
https://radia.blog.csdn.net/article/details/78270181?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link

Linux内核defconfig在哪,如何确定使用的kernel defconfig和dts配置文件 比较实用 新手福利...
https://blog.csdn.net/weixin_42318030/article/details/116820657?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1

如何确定使用的kernel defconfig和dts配置文件 比较实用 新手福利
https://blog.csdn.net/weixin_42082222/article/details/104663389

高通平台defconfig文件的确定
https://blog.csdn.net/qwaszx523/article/details/71425594
初识defconfig
https://www.akr-developers.com/d/108
Linux内核defconfig在哪,如何确定使用的kernel defconfig和dts配置文件 比较实用 新手福利...
https://blog.csdn.net/weixin_42318030/article/details/116820657

如果需要 android 开机时,串口就是 777 的权限,可以修改 device/qcom/msm8937_32/init.target.rc 文件。

on boot
    start rmt_storage
    insmod /system/lib/modules/adsprpc.ko
    chmod 0660 /dev/ttyMSM1
    chmod 0777 /dev/ttyMSM2

类似于这样的改法即可。

改完之后,需要整体编译才行,单独编译 kernel 是没用的,编译 system 和 vendor ,又因为校验通不过,所以只能整体编译,整体烧录。

使用 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的数据手册(网上都有)。

- 阅读剩余部分 -