IMX8MP-Android 11添加4G通信模块

IMX8MP-Android 11添加4G通信

1. 相关驱动添加 — 挂载EC20硬件

添加 USB接口 EC20 进行 4G 通信需要先将硬件设备挂载到系统内核上。这里我直接通过修改 Makefile 将所需驱动强制编入内核。也可通过make menuconfig 命令进行修改,但是 depond 关系比较复杂。

1.1. 将 usbserial、option、usb_wwan 编入内核

修改 vendor/nxp-opensource/kernel_imx/drivers/usb/serial/Makefile 内容如下:

# obj-$(CONFIG_USB_SERIAL)			+= usbserial.o
obj-y			+= usbserial.o

# option.c 需修改,将EC20相关信息添加
# obj-$(CONFIG_USB_SERIAL_OPTION)			+= option.o
obj-y		+= option.o

# obj-$(CONFIG_USB_SERIAL_WWAN)			+= usb_wwan.o
obj-y			+= usb_wwan.o
1.2. 依赖驱动

将相关驱动的依赖驱动也都需要编入内核中

  • 修改 vendor/nxp-opensource/kernel_imx/drivers/usb/Makefile 如下:

    obj-y		+= class/
    obj-y		+= class/
    obj-y		+= class/
    obj-y		+= class/
    # obj-$(CONFIG_USB_ACM)		+= class/
    # obj-$(CONFIG_USB_PRINTER)	+= class/
    # obj-$(CONFIG_USB_WDM)		+= class/
    # obj-$(CONFIG_USB_TMC)		+= class/
    
    obj-y	+= serial/
    # obj-$(CONFIG_USB_SERIAL)	+= serial/
    
  • 修改 vendor/nxp-opensource/kernel_imx/drivers/usb/class/Makefile 如下:

    obj-y		+= cdc-acm.o
    obj-y		+= usblp.o
    obj-y		+= cdc-wdm.o
    obj-y		+= usbtmc.o
    
    # obj-$(CONFIG_USB_ACM)		+= cdc-acm.o
    # obj-$(CONFIG_USB_PRINTER)	+= usblp.o
    # obj-$(CONFIG_USB_WDM)		+= cdc-wdm.o
    # obj-$(CONFIG_USB_TMC)		+= usbtmc.o
    
1.3. 添加 EC20 USB驱动

qmi_wwan 是 Linux 内核中的一个 USB 驱动程序,用于支持基于 QMI(Qualcomm MSM Interface)协议的 USB 无线宽带设备。

  • 修改 vendor/nxp-opensource/kernel_imx/drivers/net/usb/Makefile 如下:

    obj-y	+= qmi_wwan_q.o		# qmi_wwan_q.c驱动由移动远提供
    # obj-$(CONFIG_USB_NET_QMI_WWAN)	+= qmi_wwan.o
    
1.4. 验证 EC20 挂载
  • 编译完成后使用 adb shell 验证驱动是否编入内核( wwan0 设备为 EC20 的网络设备 ):

    evk_8mp:/ $ adb shell
    evk_8mp:/ $ ifconfig wwan0                                                             
    wwan0     Link encap:UNSPEC    Driver qmi_wwan_q
              NOARP  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:0 TX bytes:0
    

    注:插入EC20等待片刻后查看。

  • 查看 Android 当前运行的 usb 驱动( 验证 optionqmi_wwan_q ):

    evk_8mp:/ $ ls /sys/bus/usb/drivers/                                                   
    aiptek        cdc_ncm     hanwang  qmi_wwan_q     usb-storage        usbhid       xpad
    asix          cdc_subset  hub      r8152          usb_acecad         usblp     	zaurus
    ax88179_178a  cdc_wdm     kbtab    snd-usb-audio  usb_ehset_test     usbserial_generic
    cdc_acm       ftdi_sio    net1080  uas            usb_serial_simple  usbtmc
    cdc_ether     gtco        option   usb            usbfs              uvcvideo
    
2. RIL - Radio Interface Layer - Android 系统中的无线通信

在 IMX8MP 的 Android 11 的SDK中的通信库无法使用,需将源码中关于 libril、reference-ril、rild 全部注释,否则添加 reference-ril.so 库后编译会报配置文件冲突错误,已经将所需库文件及配置放入ec20文件夹中。

RIL进行重新配置之前,需要将 hardware/ril 目录中 libril、rild、reference-ril 文件夹进行压缩备份后删除。

2.1. 添加ec20目录
  • 文件内容如下:

    ec20/
    ├── apns-conf.xml	# 配置 APN(Access Point Name)
    ├── libreference-ril.so		#  RIL 接口库文件
    ├── libril.so	# 无线电接口层(RIL,Radio Interface Layer)的一个共享库文件
    ├── rild		# 无线电通信服务
    └── rild.rc		
    
  • rild.rc

    服务声明,用于启动 RIL Daemon(Radio Interface Layer Daemon)。(RIL Daemon 是 Android 系统中用于处理与无线电通信(比如移动网络)相关的功能的后台进程。)

    service vendor.ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril.so
        class main
        user radio
        group radio cache inet misc audio log readproc wakelock
        capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
    

    service 表明这是一个服务声明

    vendor.ril-daemon 是服务的名称,表示这是供应商(vendor)提供的 RIL Daemon 服务

    /vendor/bin/hw/rild 是服务的可执行文件路径,即 RIL Daemon 的二进制文件的位置

    -l /vendor/lib64/libreference-ril.so 表示 RIL Daemon 将加载的库文件的路径,这里是 libreference-ril.so

    **class main**指定了服务的类别,这里是 main 类别。main 类别通常表示这是一个主要的系统服务

    **user radio**指定了服务的运行用户,这里是 radio 用户

    **group radio cache inet misc audio log readproc wakelock**指定了服务的运行组,这里列出了多个组,包括 radiocacheinetmiscaudiologreadprocwakelock

    **capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW**指定了服务的 Linux 能力(Linux capabilities)。这些能力用于提供特定的权限。在这里,包括 BLOCK_SUSPENDNET_ADMINNET_RAW

2.2. 构建 Android 系统配置

指定一些打包到 Android 系统镜像中的组件和文件,device/nxp/imx8m/evk_8mp/evk_8mp.mk 添加内容如下:

PRODUCT_PACKAGES += \
    libhidlbase.vendor \
    libhwbinder.vendor \
    android.hardware.radio@1.3.vendor \
    android.hardware.radio@1.4.vendor \
    android.hardware.radio.deprecated@1.0.vendor \
    libhidlbase.vendor \
    libhwbinder.vendor \
    android.hardware.radio.config@1.0.vendor \
    android.hardware.radio.config@1.1.vendor \
    android.hardware.radio.config@1.2.vendor \
    android.hardware.radio@1.5.vendor
    
PRODUCT_COPY_FILES += \
		device/nxp/imx8m/evk_8mp/ec20/apns-conf.xml:system/etc/apns-conf.xml \
		device/nxp/imx8m/evk_8mp/ec20/rild.rc:vendor/etc/init/rild.rc \
		device/nxp/imx8m/evk_8mp/ec20/rild:vendor/bin/hw/rild \
		device/nxp/imx8m/evk_8mp/ec20/libril.so:vendor/lib64/libril.so \
		device/nxp/imx8m/evk_8mp/ec20/libreference-ril.so:vendor/lib64/libreference-ril.so

上述配置用于确保在构建 Android 系统时,包含了特定版本的 HAL 模块、配置文件和库文件,以及设备特定的 RIL Daemon 相关组件。

2.3. 配置 Android 设备属性

IMX8MP默认为 Wi-Fi only 设备,对于 Wi-Fi only 设备,禁用了 ro.radio.noril 属性,我们需要将其设为 4G版本设备并支持 ro.radio.noril 属性。

在IMX8MP开发板SDK中,device/nxp/imx8m/ProductConfigCommon.mk 修改内容如下:

# wifionly device
#PRODUCT_PROPERTY_OVERRIDES += \
#    ro.radio.noril=yes

# 添加 4G version 
PRODUCT_PROPERTY_OVERRIDES += \
    ro.radio.noril=no
# noril属性需要配置为no,不能配置为 true 或 yes

对于 Wi-Fi only 设备,该属性被设置为 “yes”,表示该设备不支持无线电通信,而对于 4G 版本设备,该属性被设置为 “no”,表示该设备支持无线电通信。

2.4. Android菜单和图标添加

修改 device/nxp/imx8mp/overlay/frameworks/base/core/res/res/values/config.xml 内容如下:

<string-array translatable="false" name="networkAttributes">
    <item>"wifi,1,1,1,-1,true"</item>
    <item>"mobile,0,0,0,-1,true"</item>
    <item>"mobile_mms,2,0,2,60000,true"</item>
    <item>"mobile_supl,3,0,2,60000,true"</item>
    <item>"mobile_dun,4,0,2,60000,true"</item>
    <item>"mobile_hipri,5,0,3,60000,true"</item>
    <item>"mobile_fota,10,0,2,60000,true"</item>
    <item>"mobile_ims,11,0,2,60000,true"</item>
    <item>"mobile_cbs,12,0,2,60000,true"</item>
    <item>"bluetooth,7,7,2,-1,true"</item>
    <item>"ethernet,9,9,2,-1,true"</item>
</string-array>
2.5. 添加 usbmisc 支持

Linux 系统中检测 USB 设备,子系统为 “usbmisc”,当具有一个非空的设备名称时,构建设备路径。

  • system/core/init/devices.cpp 中添加如下内容:

    } else if (uevent.subsystem == "usbmisc" && !uevent.device_name.empty()) {devpath = "/dev/" + uevent.device_name;
    
  • 函数节选

        if (!uevent.device_name.empty()) {
            devpath = "/dev/" + uevent.device_name;
        } else {
            // This imitates the file system that would be created
            // if we were using devfs instead.
            // Minors are broken up into groups of 128, starting at "001"
            int bus_id = uevent.minor / 128 + 1;
            int device_id = uevent.minor % 128 + 1;
            devpath = StringPrintf("/dev/bus/usb/%03d/%03d", bus_id, device_id);
        }
        } else if (uevent.subsystem == "usbmisc" && !uevent.device_name.empty()) {
        devpath = "/dev/" + uevent.device_name;
    } else if (StartsWith(uevent.subsystem, "usb")) {
        // ignore other USB events
        return;
    } else {
        devpath = "/dev/" + Basename(uevent.path);
    }
    
2.6. Android 平台上与无线电通信相关的 HAL 接口修改

在8MP开发板SDK中,device/nxp/imx8mp/evk_8mp/manifest.xml 中需添加内容如下:

<hal format="hidl">
    <name>android.hardware.radio</name>
    <transport>hwbinder</transport>
    <fqname>@1.5::IRadio/slot1</fqname>
    <fqname>@1.2::ISap/slot1</fqname>
</hal>
  • < hal>:这是 HAL 描述的起始标记,表明接下来的内容是一个 HAL 描述。

  • < name >android.hardware.radio< /name >:指定了 HAL 的名称,这里是 “android.hardware.radio”。

  • **< transport >hwbinder< /transport >:**指定了 HAL 的传输层,这里是 “hwbinder”。HwBinder 是 Android 中的硬件通信机制.

  • **< fqname >@1.5::IRadio/slot1< /fqname >< fqname >@1.2::ISap/slot1< /fqname >:**描述 HAL 接口的两个 Fully Qualified Name(FQName)。它们分别是 “IRadio” 和 “ISap” 接口的 FQName,指定了接口的版本(1.5 和 1.2)以及对应的 slot(slot1)。

    FQName 的结构通常是 @<version>::<InterfaceName>/<slot>,其中 <version> 是接口的版本,<InterfaceName> 是接口的名称,<slot> 是一个标识符,用于区分同一接口的不同实例。

2.7. Android 操作中的 SELinux 安全修改

在 Android 中,SELinux(Security-Enhanced Linux)是一个强化的 Linux 安全模块,用于实施强制访问控制策略。u:object_r:radio_device:s0u:object_r:rild_exec:s0 指定了对象的类型和安全等级。

在8mp开发板SDK中,device/nxp/imx8m/sepolicy/file_contexts 需要添加如下内容:

/dev/ttyUSB[0-9]   u:object_r:radio_device:s0 
# 指定了 USB 串口设备的 SELinux 上下文。/dev/ttyUSB[0-9] 匹配 /dev/ttyUSB0、/dev/ttyUSB1 ...
/dev/ttyACM[0-9]   u:object_r:radio_device:s0 	# USB ACM(Abstract Control Model)设备
/dev/cdc-wdm[0-9]  u:object_r:radio_device:s0 	# CDC-WDM 设备
/dev/qcqmi[0-9]  u:object_r:radio_device:s0 	# QMI 设备
/vendor/bin/hw/rild  u:object_r:rild_exec:s0 	# rild 进程
/dev/socket/rildOemHook     u:object_r:rild_socket:s0 # rild 进程的一个 socket 文件
2.8. 设备文件权限和属性的设置

设备权限如果不修改的话,上层就无法对该设备进行操作,EC20 直观的表现就是设备挂载都正常但是没有网络。

  • 临时权限

    chmod 777 /dev/ttyUSB*
    chmod 777 /dev/...*			# 使用chmod对目标设备进行权限开放
    
  • 永久权限

添加 device/nxp/imx8m/evk_8mp/ueventd.nxp.rc 内容如下:

/dev/ttyUSB* 0660 radio radio
/dev/ttyACM* 0660 radio radio
/dev/cdc-wdm* 0660 radio radio
/dev/qcqmi* 0660 radio radio
/dev/cdc-acm* 0660 radio radio
/dev/ttyUSB* 	0660 		radio 		radio
# 设备文件		设备权限	设备所有者	设备所有者所在组
3. 上述修改所需文件目录

相关文件存放在合肥服务器:192.168.10.100/upload/data/IMX8MP-Android11添加4G所需文件.zip

注:若要替换 ril 文件夹需要将原先的 .git 保留替换。

IMX8MP-Android11添加4G所需文件
├── 8mp-cp-img.sh
├── ec20
│   ├── apns-conf.xml
│   ├── libreference-ril.so
│   ├── libril.so
│   ├── rild
│   └── rild.rc
├── option.c
├── qmi_wwan_q.c
└── ril
    ├── Android.bp
    ├── CleanSpec.mk
    ├── include
    │   ├── libril
    │   │   └── ril_ex.h
    │   └── telephony
    │       ├── librilutils.h
    │       ├── record_stream.h
    │       ├── ril_cdma_sms.h
    │       ├── ril.h
    │       ├── ril_mcc.h
    │       ├── ril_mnc.h
    │       ├── ril_msim.h
    │       └── ril_nv_items.h
    ├── librilutils
    │   ├── Android.bp
    │   ├── librilutils.c
    │   ├── proto
    │   │   ├── sap-api.options
    │   │   └── sap-api.proto
    │   └── record_stream.c
    ├── libril.zip
    ├── OWNERS
    ├── reference-ril.zip
    └── rild.zip

7 directories, 28 files

所需资源已经上传

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,烧录imx8mpAndroid系统可以按照以下步骤进行: 1. 首先,校准DDR,确保没有问题。如果校准DDR后没有问题,可以将文件拷贝到对应的目录下。在《Android_User’s_Guide.pdf》的第50页有对应的说明,请仔细阅读。关键的两步是: - 将`${MY_ANDROID}/vendor/nxp/fsl-proprietary/uboot-firmware/imx8q/board-imx8qxp.c`拷贝到`scfw_export_mx8qx_b0/platform/board/mx8qx_mek/board.c` - 将`build_mx8qx_b0/scfw_tcm.bin`拷贝到`${MY_ANDROID}/vendor/nxp/fsl-proprietary/uboot-firmware/imx8q/mx8qx-scfw-tcm.bin` 2. 使用uuu + bootloader(等同于uuu + SDP)进行烧录。可以下载适用于imx6/imx7/imx8qxp的bootloader,并将其下载到内部RAM中。然后使用以下命令进行烧录: ``` uuu uboot.imx uuu flash.bin ``` 3. 最后,使用内建的烧录脚本来完成烧录过程。 请注意,以上步骤仅供参考,具体的烧录过程可能因为不同的环境和要求而有所不同。建议参考相关文档或咨询相关技术支持以获取更准确的指导。 #### 引用[.reference_title] - *1* [NXP(imx8qxp)系列DDR校准以及android镜像烧录](https://blog.csdn.net/weixin_51178981/article/details/123995811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [imx8 uuu烧录](https://blog.csdn.net/weixin_39951217/article/details/110260043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值