msm8909 Android6.0杂记

高通msm8909 Android6.0 笔记(未完)

一 : 添加新板
二 :DDR配置
三 : EMMC && SD card 配置
四: GPIO/I2C/SPI/SDIO/UART 配置
五 : Lights :背光、摄像机灯光配置
六 : 触摸屏配置
七 : 虚拟按键配置
八 : Connectivity : Bluetooth、Wi-Fi、GNSS配置
九: 传感器(sensor) : 重力传感器、环境光/接近传感器
十: LCD配置
十一: Audio音频配置
十二: Camera配置
十三: Power电源管理配置
十四: Logo 添加
十五: 开机动画(boot animation)
十六: OTA

一添加新板(Add new board)

1: Android 编译自定义(compile customization)

1.1:Android config(1):

在 /android/device/qcom 下创建 msm8909_xxx文件夹,然后拷贝其他文件的配置文件到msm8909_xxx 修改配置

1.2:Android config(2) :配置 msm8909_xxx中的配置文件

    必须配置的(necessary) : AndroidBoard.mk  :  #board makefile
                AndroidProducts.mk : #product makefile
                BoardConfig.mk   :  #board config
                msm8909_xxx.mk    : #target config
    可选择的(optional) :   init.target.rc  : #init resource config
                system.prop    :  #system properties
                recovery.fstab  : #recovery fs table
                fstab.qcom    :  #normal fs table

1.3:Android config(3) :

/device/qcom/common/vendorsetup.sh
add_lunch_combo msm8909_xxx-userdebug

/vendor/qcom/proprietary/common/config/device-vendor.mk
add into project list: PRODUCT_LIST += msm8909_xxx

/device/qcom/msm8909_xxx/msm8909_xxx.mk :asign product name && device:
$(call inherit-product, device/qcom/msm8909/msm8909.mk)
PRODUCT_NAME := msm8909_xxx
PRODUCT_DEVICE := msm8909_xxx

1.4:Android config(4) :

/device/qcom/msm8909_xxx/AndroidBoard.mk : asign kernel default config :
KERNEL_DEFCONGIF := msm8909-xxx_defconfig
/devcie/qcom/msm8909_xxx/AndroidProducts.mk : add product features
RODUCT_MAKEFILES : = \
$(LOCAL_DIR)/msm8909_xxx.mk
/device/qcom/msm8909_xxx/BoardConfig.mk : add board config:
include device/qcom.msm8909/BoardConfig.mk

1.5:Android config(5) : Add board to ./build_8909.sh

android()
{
cd ${TOP_DIR}/LINUX/android
source build/envsetup.sh 
lunch 27     //新板编码号 lunch
mkdir -p ${OUT}/download_images
mkdir -p ${OUT}/collect_elfs
m -j8 2>&1 | tee build_android.log
cd ${TOP_DIR}
}

2: Kernel 配置自定义: 自定义默认配置 :

 in kernel/arch/arm/configs 拷贝其他工程的配置文件并且重命名,此配置文件被用于 AndroidBoard.mk

3:SBL dts 自定义配置:

3.1: 选择那一种DTS ?MTP ? QRD

选择DTS基于硬件设计,包括高通公司默认的 MTP或者QRD设计;

3.2: 应该怎么在代码中选择具体的DTS :

修改 platform_id 在 boot_images/core/boot/secboot3/hw/msm8909/boot_cdt_array.c去匹配新的 platform id 在dts中

3.3: SBL中的平台ID对内核上的DTS有什么影响?

 SBL获取平台ID 和 平台子类型
 SBL写入共享内存
 LK(即为bootloader(littlekernel))获取信息并且找到合适的DTS条目

    boot_images/core/boot/secboot3/hw/msm8909/boot_cdt_array.c:
    0x03,0x0B,0x01,0x00,0x00,0x00
    对于SBL:Byte0 : 0x03    platform_id version
         Byte1 : 0x0B     platform_id type  
                  0x08 : target is a MTP device
                  0x0B : target is a QRD device
         Byte2 : platform_id major platfoem version
         Byte3 : platform_id minor platform version
         Byte4 : paltform_id subtype

    对于DTS :
        qcom,board-id = <platform_id,subtype_id>
                    对于MTP型dts : 
                compatible = "qcom,msm8909-mtp"
                    qcom,board-id = <8 0x100>;// 8 :Byte1 0x08   0x00:Byte4 0x00 
        对于QRD型dts :
                qcom,board-id = <0x1000b 0x100>; //Byte1 0x0B   0x00:Byte4 0x00 

4:启动流:

PBL : 固话在CPU内部,是芯片上电后执行的真正的第一行代码,在正常的启动流成中会加载 SBL1
SBL1: 位于eMMC中,由PLB加载,初始化buses,DDR,clocks,加载QSEE,RPM,APPSBL等
QSEE:创建安全环境
APPSBL:即为bootloader 目前使用LK(little kernel) 初始化设备,设置启动模式,加载kernel
Kernel: 设备以及内核初始化,加载Modem,加载WCN,内核态init进程
Android: 用户态init进程,Zygote启动,Android,Framewoek初始化

二:DDR配置 :

DDR配置文件:boot_images/core/boot/secboot3/scripts/
    jedec_lpddr2_single_channel.xml
    jedec_lpddr3_single_channel.xml
DDR配置参数:
    例如 DDR type、Mode、tRFC、tXSR, check DDR vendor specification:
    <props name="ddr_type" ...> 5 </props>
    <props name="interleaved" ...> 0 </props>
    <props name=“tRFC” ...> 2100 </props>
    <props name="tXSR" ...> 2200 </props>
    CDC(Calibrated Delay Circuit)部分参数请参考文档:ddr_workflow_and_debugging_guide.pdf
DDR参数生成流:
    在配置文件目录下执行
    python cdt_generator.py jedec_lpddr3_single_channel.xml platform_ddr.bin
    生成 platform_ddr.bin boot_cdt_array.c 替换目标文件
    boot_images/core/boot/secboot3/hw/msm8909/boot_cdt_array.c

三:EMMC and SD Card 配置:

EMMC and SD Card 配置: 功能描述、EMMC分区配置、外部SD卡配置、驱动探测函数说明EMMC分区配置 :

2个引导分区(boot area partitions):两个区域在存储的稳定性、可靠性及擦除次数上都远比UDA要好,所以很多chipset上都会使用这两个区域来存放一下关键数据,如boot image,default 配置参数等等,MTK使用UDA来存放boot data,而使用boot area来存放配置参数;Qualcomm则使用Boot 1 来存放boot data,boot 2 来存放配置参数1个RPMB(Replay Protected Memory Block):用于给系统存放一些特殊的需要进行访问授权的数据1个UDA(User Data Area) 用户数据空间:是AP及用户可以进行读写存储的区域,通常其大小为整块EMMC表示大小的93%左右,即4GB的eMMC UDA的区域只有4GB*93%=3809MB

之前说的BOOT1&2、RPMB和UDA区域我们都可以认为他们在物理上是独立的(当然都是存在于同一块die上)。即他们各自的物理起始地址都是0x0

……略

四:GPIO/I2C/SPI/SDIO/UART 配置

……略

五:Lights

5.1 : LED Architecture 见 LED_Architecture 图片

5.2 : 代码结构

    HAL : /hardware/qcom/display/liblight/lights.c
    Kernel : /kernel/drivers/leds/leds-class.c
          /kernel/drivers/leds/led-core.c
          /kernel/drivers/leds/led-triggers.c
    Custom driver file(自定义驱动文件)
        lcd backlight driver:
          /kernel/drivers/pwm/pwm-qpnp.c
          /kernel/drivers/video/msm/mdss/mdss_fb.c
          /kernel/drivers/video/msm/mdss/mdss_fb_panel.c
          /kernel/bootloader/lk/target/msm8909/target_display.c
        camera led flash driver
          /kernel/drivers/leds/leds-msm-gpio-flash.c
          /kernel/drivers/media/platform/msm/camera_v2/sensor/flash/msm_led_trigger.c
          /kernel/drivers/media/platform/msm/camera_v2/sensor/flash/msm_led_flash.c
          /kernel/drivers/media/platform/msm/camera_v2/sensor/flash/msm_led_torch.c

5.3 : 背光: PWM mode、DCS mode、WLED mode

    PWM mode : PMIC输出PWM控制背光芯片
    DCS mode : 通过MIPI配置LCMIC寄存器输出PWM控制背光芯片
    WLED mode: GPIO、I2C等控制背光芯片

5.4 : 修改 bootloader(LK(litte kernel))部分修改:增加LCM供应商提供的(lcd显示驱动接口)文件时,要增加相应的背光配置:

    确认背光模式:本项目是 WLED模式
     /bootable/bootloader/lk/dev/gcdb/display/include/panel_otm1285a_auo_hd_video.h
        static struct backlight otm1285a_auo_hd_video_backlight = {
        1,1,255,100,0,0,  //第一个位 0:PWM mode; 1:WLED mode; 2:DCS mode
        };  

    确认引脚:/bootable/bootloader/lk/target/msm8909/include/target/display.h
        static struct gpio_pin bkl_gpio

    确认占空比 频率:
        PWM mode : /bootable/bootloader/lk/target/msm8909/target_display.c
            #define PWM_DUTY_US 13   //占空比
            #define PWM_PERIOD_US 27  //频率?

        WLED mode :lk/platform/msm_shared/mipi_dsi.c
            static char lcm_pwm_cmd1[] = {
                0x02, 0x00, 0x29, 0xC0,
                0x51, 0x7F, 0xFF, 0xFF,
            };

    在背光入口函数: 修改增加背光芯片驱动控制, 例如GPIO控制
        /bootable/bootloader/lk/target/msm8909/target_display.c
        bkl_gpio.pin_id = 36; //背光控制引脚设定

5.5:kernel部分:增加LCM供应商提供的文件时,需要增加背光配置,参考硬件原理图和背光驱动芯片的PWM工作频率范围,在设备树中添加属性,比如frequecny,bank,gpio等等

    /kernel/arch/arm/boot/dtsi/qom/msm8909-mtp.dtsi
    //改成 pwm 或者 wled 或者 dcs 模式
    &spi_gc9305_qvga_cmd {
        qcom,mdss-spi-bl-pmic-control-type = "bl_ctrl_wled";//WLED mode
        qcom,mdss-spi-bl-pmic-bank-select = <0>; //PWM BANK : 0
        qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>;
        qcom,mdss-dsi-pwm-gpio = <&pm8909_mpps 2 0>;
        qcom,cont-splash-enabled;
        };

    PWM MODEL:
        驱动文件修改: MPP 2 配置为PWM 输出
        /kernel/arch/arm/boot/dtsi/qom/msm8909-pm8909-mtp.dtsi

        mpp@a100 { /* MPP 2 */
        /* Backlight PWM */
            qcom,mode = <1>;        /* Digital output */
            qcom,invert = <0>;      /* Disable invert */
            qcom,src-sel = <4>;     /* DTEST1 */
            qcom,vin-sel = <0>;     /* VPH_PWR */
            qcom,master-en = <1>;       /* Enable MPP */
        };

    驱动文件修改: 配置PWM基础属性:
        /kernel/arch/arm/boot/dtsi/msm-pm8909.dts
            pm8909_pwm: pwm@bc00 {
        compatible = "qcom,qpnp-pwm";//pwm 寄存器地址 偏移量
        reg = <0xbc00 0x100>; //
        reg-names = "qpnp-lpg-channel-base";
        qcom,channel-id = <0>; //pwm通道ID
        qcom,supported-sizes = <6>, <9>;//PWM 占空比
        #pwm-cells = <2>;
        };

    WLED MODE:
        修改DTS文件 : /kernel/arch/arm/boot/dtsi/qom/msm8909-mtp.dtsi
        backlight_1wire:bklt-1wire {
            compatible = "qcom,leds-gpio-bklt";
            status = "disabled";
            qcom,bklt-1wire = <&msm_gpio 15 0>;//36?
            linux,name = "bklt-1wire";
            linux,default-trigger = "bkl-trigger";
        };
    在目录 /kernel/drivers/leds 新增 leds-msm-bklt-wd3138.c
    修改编译配置 /kernel/drivers/leds/Makefile  :  obj-$(CONFIG_LEDS_MSM_GPIO_FLASH) += leds-msm-bklt-wd3138.o
    修改编译配置 /kernel/drivers/leds/Kconfig
    /kernel/arch/arm/config/msm8909-1gb_defconfig  : CONFIG_LEDS_WD3138 = y

六:触摸屏配置

6.1 :编译配置

TP驱动文件
    .c路径 : kernel\drivers\input\touchscreen
    .h路径 : 在.c文件中使用include声明,如果和c文件不处于同一个文件,则对应修改 

kernel\drivers\input\touchscreen\focaltech_touch\focaltech_core.c
kernel\arch\arm\boot\dts\qcom\msm8909-mtp.dtsi



                    挂载  &i2c_1 { /* BLSP1 QUP1 */
                            focaltech@38{                         // i2c设备7位地址
                                compatible = "focaltech,fts"; //匹配驱动文件 compatible
                                reg = <0x38>;                 // i2c设备7位地址
                                interrupt-parent = <&msm_gpio>; //中断属性配置
                                interrupts = <13 0x2>;       //中断属性配置
                                vdd-supply = <&pm8909_l17>;  //电源口配置
                                vcc_i2c-supply = <&pm8909_l6>;  //电源口配置
                                pinctrl-names = "pmx_ts_active","pmx_ts_suspend","pmx_ts_release";
                                pinctrl-0 = <&ts_int_active &ts_reset_active>;
                                pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
                                pinctrl-2 = <&ts_release>;
                                reset-gpios = <&msm_gpio 12 0x0>;
                                interrupt-gpios = <&msm_gpio 13 0x2008>;
                                focaltech,panel-coords = <0 0 240 320>;  //驱动文件获取的各项参数
                                focaltech,display-coords = <0 0 240 320>;
                                focaltech,button-map= <139 102 158>;
                                focaltech,no-force-update;
                                focaltech,i2c-pull-up;
                            };
                    };
    编译控制
        kernel\arch\arm\configs\* :CONFIG_TOUCHSCREEN_XXX = y      CONFIG_TOUCHSCREEN_FTS=y
            Kconfig  : kernel\drivers\input\touchscreen\Kconfig
        Makefile : kernel\drivers\input\touchscreen\Makefile

6.2 配置设备树

        配置文件: kernel\arch\arm\boot\dts\qcom\xxx.dtsi  根据编译配置寻找对应的i2c设备挂载文件
        世纪天元手机6.0 kernel\arch\arm\boot\dts\qcom\msm8909-mtp.dtsi
        世纪天元手机5.1 kernel\arch\arm\boot\dts\qcom\msm8909-E8909-mtp.dtsi

6.3 驱动文件

6.3.1 : 驱动文件挂载配置 :驱动文件和设备树匹配,需要在C文件中添加语句

        世纪天元手机6.0  kernel\drivers\input\touchscreen\focaltech_touch\focaltech_core.c
        世纪天元手机5.1  kernel\drivers\input\touchscreen\focaltech_touch\focaltech_core.c

6.4 检验:

查看dts设备是否初始化成功: adb shell cd /sys/bus/i2c/devices 1-0038
查看dts驱动是否初始化成功: adb shell cd /sys/bus/i2c/drivers /ls 1-0038

七 虚拟按键配置

…略

十二 LCD配置

12.1:LK部分配置

12.1.1: 增加屏的初始化文件

增加屏的初始化文件(供应商提供参数,自己按照平台格式添加初始化命令),以ST0281为例 :/bootable/bootloader/lk/dev/gcdb/display/include/panel_gc9305_qvga_spi_cmd.h

12.1.2:修改设置 LCD 屏引脚参数

/bootable/bootloader/lk/target/msm8909/include/target/display.h : 修改设置 LCD 屏引脚参数

12.1.3: 增加本项目LCD屏选项 : /boottable/bootloader/lk/target/msm8909/oem_panel.c

/boottable/bootloader/lk/target/msm8909/oem_panel.c  
        增加头文件 : #include "include/panel_gc9305_qvga_spi_cmd.h"  

    在选择屏幕列表中添加 本项目LCD屏
    enum {
    HX8394D_480P_VIDEO_PANEL,
    ...
    GC9305_QVGA_SPI_CMD_PANEL,
    };


    在panel list中添加 panel_name 和 panel_id
    static struct panel_list supp_panels[] = {
    ...
    {"gc9305_qvga_cmd", GC9305_QVGA_SPI_CMD_PANEL},     
    };

    在 init_panel_data函数中添加 本项目LCD屏幕结构体初始化:                          
    case GC9305_QVGA_SPI_CMD_PANEL:
    panelstruct->paneldata    = &gc9305_qvga_cmd_panel_data;
    panelstruct->panelres     = &gc9305_qvga_cmd_panel_res;
    panelstruct->color        = &gc9305_qvga_cmd_color;
    panelstruct->panelresetseq= &gc9305_qvga_cmd_reset_seq;
    panelstruct->backlightinfo = &gc9305_qvga_cmd_backlight;
    pinfo->spi.panel_cmds   = gc9305_qvga_cmd_on_command;
    pinfo->spi.num_of_panel_cmds= GC9305_QVGA_CMD_ON_COMMAND;
    pan_type = PANEL_TYPE_SPI;
    break;

    选择本项目LCD:
    屏幕的自适应方式配置 oem_panel_select() :
    if((280000 <= lcd_id)&&(lcd_id < 480000))  /* 0.38 */
        panel_id = OTM1285A_AUO_HD_VIDEO_PANEL;
    else
        panel_id = ILI9881C_YUSUN_HD_VIDEO_PANEL;
        panel_id = GC9305_QVGA_SPI_CMD_PANEL;  //根据lcd_ID值范围实现自适应

12.4:Kernel部分配置:

添加屏幕驱动文件: /kernel/arch/arm/boot/dts/qcom/..添加 spi-panel-gc9305-qvga-cmd.dtsi
增加对屏幕的支持: /kernel/arch/arm/boot/dts/qcom/msm8909-mtp.dtsi 文件中增加对屏幕的支持 
        增加头文件  #include "spi-panel-gc9305-qvga-cmd.dtsi"
        设置背光控制模式 :
                    &spi_gc9305_qvga_cmd {
                    qcom,mdss-spi-bl-pmic-control-type = "bl_ctrl_wled";
                    qcom,mdss-spi-bl-pmic-bank-select = <0>;
                    qcom,cont-splash-enabled;
                };

……………………………………………………………………..剩余部分慢慢补充…………………………………………………………………………….


猜你喜欢

转载自blog.csdn.net/linuxarmbiggod/article/details/80138684