• Android驱动框架整理之device框架



    继kernel后继续分析device下的框架

    一、文件系统

    cluo@cluo:/sd2/VT-MX8QXP-M08-A/device/nxp$ ls
    automation_config  imx6dq  imx6sx  imx7ulp  imx8q    MODULE_LICENSE_APACHE2  verity
    common             imx6sl  imx7d   imx8m    imx8ulp  NOTICE
    
    
    • 1
    • 2
    • 3
    • 4

    在对应的目录下,我们从官网下载的代码其实已经有了对应的官方支持,已经列举了几个支持的板级目录,就是上面的 imx6q imx8q imx8m 这些.

    cluo@cluo:/sd2/VT-MX8QXP-M08-A/device/nxp/common$ ls
    audio-json  imx_path  input           partition  seccomp_policy  tools
    build       init      kernel-headers  recovery   security        wifi
    
    • 1
    • 2
    • 3

    还有一个公用的内容就放在从common目录下,比如说audio的相关配置文件就在 audio-json 这个目录下,因为我也是后面才了解到,nxp这边是通过配置文件 json去配置相关寄存器的设置的,所以之前调试es8316的时候,还弄了几天。

    对应的一些路径文件就在 imx_path 这个里面的 .mk文件中可以看到定义的路径宏

    input目录下是一些触摸相关的配置文件,比如之前说过的触摸屏幕变为鼠标如何进行修改等等。

    tools目录下就是imx的相关编译和烧录脚本和一些打包脚本。

    进入到imx8q的目录下,这里面就是对应的板级目录了

    cluo@cluo:/sd2/VT-MX8QXP-M08-A/device/nxp/imx8q$ ls
    AndroidProducts.mk                           mek_8q                  sepolicy
    BoardConfigCommon.mk                         permissions             sepolicy_car
    com.example.android.systemupdatersample.xml  ProductConfigCommon.mk  UbootKernelCommonConfig.mk
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    AndroidProducts.mk 这个目录下看到对应的lunch文件选择项

    PRODUCT_MAKEFILES := \
      $(LOCAL_DIR)/mek_8q/mek_8q.mk \
      $(LOCAL_DIR)/mek_8q/mek_8q_car.mk \
      $(LOCAL_DIR)/mek_8q/mek_8q_car2.mk
    
    COMMON_LUNCH_CHOICES := \
      mek_8q-user \
      mek_8q-userdebug \
      mek_8q_car-user \
      mek_8q_car-userdebug \
      mek_8q_car2-user \
      mek_8q_car2-userdebug
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上面是编译对应的mk文件,下面就是你编译之前选择lunch的时候的选项,包括以后自己去添加工程的时候,也是在这里添加对应的lunch和mk文件

    BoardConfigCommon.mk: 这个里面应该是一些配置说明,没有仔细去了解过这里面配置,我也不太清楚这里面的东西又啥用,没去修改验证过。

    sepolicy 这里面都是一些 te文件,也就是关于权限的 允许 读 写 这些:

    allow init configfs:dir  { write add_name remove_name create };
    //据个例子
    //允许 Init域 可以对 configfs这个目录下的文件进行 写 添加和 删除 创造等
    
    • 1
    • 2
    • 3

    更具体的语法就没去细致了解过了

    再下面的就是mek_8q文件了。这就是细致的文件说明了

    cluo@cluo:/sd2/VT-MX8QXP-M08-A/device/nxp/imx8q/mek_8q$ ls
    4G_modem                            car_display_settings.xml     init.recovery.nxp.rc         seccomp
    android_addition_defconfig          compatibility_matrix.xml     init.usb.rc                  sepolicy
    AndroidBoard.mk                     core_64_bit_car.mk           init.zygote_auto.rc          sepolicy_car
    AndroidUboot.mk                     device_framework_matrix.xml  input-port-associations.xml  setup.core.car2.cfg
    AP6275                              early.init_car.cfg           mag_sensor                   setup.core.cfg
    apns-conf.xml                       early.init.cfg               manifest_car.xml             setup.main.car2.cfg
    app_whitelist.xml                   eeprom                       manifest.xml                 setup.main.cfg
    audio_effects_car.xml               external_camera_config.xml   mek_8q_car2.mk               SharedBoardConfig.mk
    audio_effects.xml                   firmware                     mek_8q_car.mk                system.prop
    audio_policy_configuration_car.xml  fstab.nxp                    mek_8q.mk                    task_profiles.json
    audio_policy_configuration.xml      fstab.nxp.car                modem                        thermal_info_config_imx8qm_car2.json
    automotive_addition_defconfig       init_car_m4.rc               nfc                          thermal_info_config_imx8qm.json
    bluetooth                           init_car_no_m4.rc            overlay                      thermal_info_config_imx8qxp_car2.json
    BoardConfig.mk                      init_car.rc                  overlay_car                  thermal_info_config_imx8qxp.json
    camera_config_imx8qm.json           init.imx8qm.rc               powerhint_imx8qm.json        TP
    camera_config_imx8qm_logic.json     init.imx8qxp.rc              powerhint_imx8qxp.json       UbootKernelBoardConfig.mk
    camera_config_imx8qxp.json          init.insmod.sh               privapp-permissions-imx.xml  ueventd.nxp.rc
    camera_config_imx8qxp_logic.json    init.rc                      required_hardware_auto.xml
    car_audio_configuration.xml         init.recovery.nxp.car.rc     required_hardware.xml
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这里面的东西还是比较多的,有的是自己添加的,有的是他原来自己有的
    首先这里面有一些json配置文件,主要是关于camera的,我猜测可能nxp的这个平台又是通过对应的json文件对camera的相关设置进行一些配置。
    xml就是一些配置文件,里面很多东西,包括界面上一些默认的选项是不是会打开等等,这个有兴趣可以自己去看一看。
    这里里面还有一些rc文件,这里面我们修改会比较多一些,主要是对文件权限进行修改,按照里面的内容仿照写就好了。

    二、如何去添加模块

    首先就是了解一些函数, 用得最多的就是 PRODUCT_COPY_FILES 这个函数了
    这个函数的最广泛作用其实就是将文件从pc端的目录下拷贝到对应开发板端

    PRODUCT_COPY_FILES +=    \
        device/nxp/imx8q/mek_8q/firmware/WiFi/fw_bcm43752a2_pcie_ag_apsta.bin:vendor/etc/firmware/bcm/fw_bcm43752a2_pcie_ag_apsta.bin \
        device/nxp/imx8q/mek_8q/firmware/WiFi/fw_bcm43752a2_pcie_ag.bin:vendor/etc/firmware/bcm/fw_bcm43752a2_pcie_ag.bin \
        device/nxp/imx8q/mek_8q/firmware/WiFi/fw_bcmdhd.bin:vendor/etc/firmware/bcm/fw_bcmdhd.bin \
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们在根目录下的对应的文件会被拷贝到对应的开发板的vendor/etc/firmaware/bcm/的目录下,我们进入开发板也能看到对应的文件,或者在对应的out目录下也能看到对应的文件

    cluo@cluo:/sd2/VT-MX8QXP-M08-A/out/target/product/mek_8q$ find -name "fw_bcm43752a2_pcie_ag_apsta.bin" 
    ./vendor/etc/firmware/bcm/fw_bcm43752a2_pcie_ag_apsta.bin
    
    • 1
    • 2

    三、如何添加一个工程

    对应的工程文件里面的内容我们需要自己去写,这里只介绍相关的Android.mk文件的编写,因为这个文件会决定我们是否是编译到。

    /i2c_rw_tool$ ls
    Android.mk  i2c_rw_tool.c  write_i2c.sh
    
    • 1
    • 2

    比如说我们在i2c_rw_tool下有三个文件,其实我们Android.mk文件内容就是下面这些

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    ifeq ($(SPEC_FOR_5071_TMFP),true)
            LOCAL_CFLAGS += -DCONFIG_SPEC_FOR_5071_TMFP
    else
    endif
    # // 上面的部分都是固定的模板,可以直接把对应的mk文件移植过来
    
    LOCAL_MODULE = i2c_rw
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := i2c_rw_tool.c
    # // 只有中间三行是需要修改的 
    # // LOCAL_MODULE 代表你要编译生成的模块,这个名字也很总要,因为等会要通过 PRODUCT_COPY_FILES 这个函数在板级的mk文件里添加,这样才能够编译到这个目录
    # // LOCAL_MODULE_TAGS 这个是模块的标签,公开的还是私有的
    # // LOCAL_SRC_FILES 这个是编译需要的c文件
    # // 最后这个也司模板
    include $(BUILD_EXECUTABLE)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    // 我们在对应的板级mk中添加下面的这段话就可以编译进去了 
    // mek-8q.mk
    PRODUCT_PACKAGES += eepromtool
    
    • 1
    • 2
    • 3

    四、指定对应的dts

    其实这个在之前的kernel的整理中已经说了,这里就不在重复了。

  • 相关阅读:
    数据分析-Pandas数据y轴双坐标设置
    记录一个删库跑路的技巧(如何快速删除数据库下面的所有表)
    山西电力市场日前价格预测【2023-10-11】
    学习新思想,争做新青年。(一)
    MySQL数据库介绍
    antd table 表格滚动高度适配
    多维数据库中的高效计算机制是什么?
    C++:C++三方库创建web程序
    Adam优化算法
    java计算机毕业设计奢品网站系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/weixin_51178981/article/details/125301783