本文共 12769 字,大约阅读时间需要 42 分钟。
一 : 添加新板
二 :DDR配置 三 : EMMC && SD card 配置 四: GPIO/I2C/SPI/SDIO/UART 配置 五 : Lights :背光、摄像机灯光配置 六 : 触摸屏配置 七 : 虚拟按键配置 八 : Connectivity : Bluetooth、Wi-Fi、GNSS配置 九: 传感器(sensor) : 重力传感器、环境光/接近传感器 十: LCD配置 十一: Audio音频配置 十二: Camera配置 十三: Power电源管理配置 十四: Logo 添加 十五: 开机动画(boot animation) 十六: OTA在 /android/device/qcom 下创建 msm8909_xxx文件夹,然后拷贝其他文件的配置文件到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
/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/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.mkandroid(){cd ${TOP_DIR}/LINUX/androidsource build/envsetup.sh lunch 27     //新板编码号 lunchmkdir -p ${OUT}/download_imagesmkdir -p ${OUT}/collect_elfsm -j8 2>&1 | tee build_android.logcd ${TOP_DIR}}   in kernel/arch/arm/configs 拷贝其他工程的配置文件并且重命名,此配置文件被用于 AndroidBoard.mk
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 =对于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 
PBL : 固话在CPU内部,是芯片上电后执行的真正的第一行代码,在正常的启动流成中会加载 SBL1SBL1: 位于eMMC中,由PLB加载,初始化buses,DDR,clocks,加载QSEE,RPM,APPSBL等QSEE:创建安全环境APPSBL:即为bootloader 目前使用LK(little kernel) 初始化设备,设置启动模式,加载kernelKernel: 设备以及内核初始化,加载Modem,加载WCN,内核态init进程Android: 用户态init进程,Zygote启动,Android,Framewoek初始化
DDR配置文件:boot_images/core/boot/secboot3/scripts/ jedec_lpddr2_single_channel.xml jedec_lpddr3_single_channel.xmlDDR配置参数: 例如 DDR type、Mode、tRFC、tXSR, check DDR vendor specification:5 0 2100 2200 CDC(Calibrated Delay Circuit)部分参数请参考文档:ddr_workflow_and_debugging_guide.pdfDDR参数生成流: 在配置文件目录下执行 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分区配置、外部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
……略
……略
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
PWM mode : PMIC输出PWM控制背光芯片 DCS mode : 通过MIPI配置LCMIC寄存器输出PWM控制背光芯片 WLED mode: GPIO、I2C等控制背光芯片
确认背光模式:本项目是 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; //背光控制引脚设定   /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   TP驱动文件    .c路径 : kernel\drivers\input\touchscreen    .h路径 : 在.c文件中使用include声明,如果和c文件不处于同一个文件,则对应修改 kernel\drivers\input\touchscreen\focaltech_touch\focaltech_core.ckernel\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   配置文件: 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.1 : 驱动文件挂载配置 :驱动文件和设备树匹配,需要在C文件中添加语句
世纪天元手机6.0 kernel\drivers\input\touchscreen\focaltech_touch\focaltech_core.c 世纪天元手机5.1 kernel\drivers\input\touchscreen\focaltech_touch\focaltech_core.c
查看dts设备是否初始化成功: adb shell cd /sys/bus/i2c/devices 1-0038
查看dts驱动是否初始化成功: adb shell cd /sys/bus/i2c/drivers /ls 1-0038…略
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值范围实现自适应   添加屏幕驱动文件: /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;                };   ……………………………………………………………………..剩余部分慢慢补充…………………………………………………………………………….
转载地址:http://wlme.baihongyu.com/