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 驱动( 验证 option 和 qmi_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
**指定了服务的运行组,这里列出了多个组,包括radio
、cache
、inet
、misc
、audio
、log
、readproc
和wakelock
**
capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
**指定了服务的 Linux 能力(Linux capabilities)。这些能力用于提供特定的权限。在这里,包括BLOCK_SUSPEND
、NET_ADMIN
和NET_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:s0
,u: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
所需资源已经上传