本文共 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/