RK3588 Android13 RM500U-CN移植
1. Kernel修改
1.1 根据原理图配置引脚
参考lte_rm310配置
Rockchip 4g modem device tree bindings
Required properties:
- compatible : "4g-modem-platdata"
Optional properties:
- 4G,vbat-gpio : 4g modem vbat gpio
- 4G,power-gpio : 4g modem power enable/disable gpio
- 4G,reset-gpio : 4g modem reset gpio
Example:
4G-Modem {
compatible="4g-modem-platdata";
4G,vbat-gpio = ;
4G,power-gpio = ;
4G,reset-gpio = ;
}
若走Pcie协议,还需要配置Pcie相关dts
1.2 添加RM500U-CN vid pid
--- a/kernel-5.10/drivers/usb/serial/option.c
+++ b/kernel-5.10/drivers/usb/serial/option.c
@@ -1183,6 +1183,7 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x0900, 0xff, 0x00, 0x00) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
@@ -2230,6 +2231,10 @@ static struct usb_serial_driver option_1port_device = {
.suspend = usb_wwan_suspend,
.resume = usb_wwan_resume,
#endif
+#if 1 //Added by Quectel
+ .reset_resume = usb_wwan_resume,
+#endif
+
};
--- a/kernel-5.10/drivers/usb/serial/usb_wwan.c
+++ b/kernel-5.10/drivers/usb/serial/usb_wwan.c
@@ -481,6 +481,14 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
if (intfdata->use_zlp && dir == USB_DIR_OUT)
urb->transfer_flags |= URB_ZERO_PACKET;
+#if 1 //Added by Quectel for zero packet
+ if (dir == USB_DIR_OUT) {
+ struct usb_device_descriptor *desc = &serial->dev->descriptor;
+
+ if (desc->idVendor == cpu_to_le16(0x2C7C))
+ urb->transfer_flags |= URB_ZERO_PACKET;
+ }
+#endif
return urb;
}
1.3 增加qmi_wwan_q驱动
移远提供的驱动:Quectel_Linux_Android_QMI_WWAN_Driver_V1.2.6.zip
--- a/kernel-5.10/drivers/net/usb/Makefile +++ b/kernel-5.10/drivers/net/usb/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_USB_NET_CX82310_ETH) += cx82310_eth.o obj-$(CONFIG_USB_NET_CDC_NCM) += cdc_ncm.o obj-$(CONFIG_USB_NET_HUAWEI_CDC_NCM) += huawei_cdc_ncm.o obj-$(CONFIG_USB_VL600) += lg-vl600.o +obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan_q.o obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o obj-$(CONFIG_USB_NET_CDC_MBIM) += cdc_mbim.o obj-$(CONFIG_USB_NET_CH9200) += ch9200.o
1.4 添加PCIe驱动
将驱动压缩包 Quectel_Linux&Android_SPRD_PCIE_Driver 解压至 Linux 源码 drivers
目录下,并在该目录下的 Makefile 文件中添加如下内容后直接编译即可。
若 PCIe 驱动被正确移植并编译成功,上位机设备的 dev 目录下会生成 spipe_nr0-14、stty_nr0-31、
snv_nr、slog_nr 和 sdiag_nr 等设备节点,同时生成 pciex(网卡名称,“x”的范围为 0~3)、sipa_dummy
等网卡。
2. Android修改
2.1 配置ril-daemon
--- a/hardware/ril/rild/rild.rc
+++ b/hardware/ril/rild/rild.rc
@@ -1,5 +1,5 @@
-service vendor.ril-daemon /vendor/bin/hw/rild
+service ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/hw/libreference-ril-quectel.so
class main
- user radio
- group radio cache inet misc audio log readproc wakelock
+ user root
+ group radio cache inet misc audio sdcard_rw log
capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
2.2 配置IRadio
--- a/device/rockchip/common/4g_modem/manifest.xml
+++ b/device/rockchip/common/4g_modem/manifest.xml
@@ -4,6 +4,7 @@
hwbinder
@1.1::IRadio/slot1
@1.1::IRadio/slot2
+ @1.5::IRadio/slot1
@1.2::ISap/slot1
--- a/device/rockchip/common/BoardConfig.mk
+++ b/device/rockchip/common/BoardConfig.mk
@@ -297,7 +297,7 @@ BOARD_FORCE_UDISK_VISIBLE ?= true
BOARD_DISABLE_SAFE_MODE ?= true
#enable 3g dongle
-BOARD_HAVE_DONGLE ?= false
+BOARD_HAVE_DONGLE ?= true
#for boot and shutdown animation ringing
BOOT_SHUTDOWN_ANIMATION_RINGING ?= false
@@ -328,7 +328,7 @@ BOARD_BLUETOOTH_LE_SUPPORT ?= true
BOARD_WIFI_SUPPORT ?= true
#for rk 4g modem
-BOARD_HAS_RK_4G_MODEM ?= false
+BOARD_HAS_RK_4G_MODEM ?= true
#for rk DLNA
PRODUCT_HAVE_DLNA ?= false
--- a/device/rockchip/common/modules/4g_modem.mk
+++ b/device/rockchip/common/modules/4g_modem.mk
@@ -27,6 +27,15 @@ PRODUCT_PACKAGES += \
android.hardware.radio@1.2-radio-service \
android.hardware.radio.config@1.0-service
+PRODUCT_PACKAGES += \
+ android.hardware.radio@1.5-radio-service \
+ android.hardware.radio.config@1.2-service \
+ android.hardware.radio.config@1.0-service \
+ android.hardware.radio.config@1.0.vendor \
+ android.hardware.radio.config@1.2.vendor \
+ android.hardware.radio@1.5.vendor \
+ libhwbinder.vendor
2.3 配置SELinux 权限
1.AT拨号权限
--- a/device/rockchip/common/rootdir/ueventd.rockchip.rc
+++ b/device/rockchip/common/rootdir/ueventd.rockchip.rc
@@ -79,6 +79,25 @@
/dev/ttyUSB8 0660 radio radio
/dev/ttyUSB9 0660 radio radio
+#quectel port
+/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
+#PCIe
+/dev/mhi_DUN 0660 radio radio
+/dev/mhi_DIAG 0660 radio radio
+/dev/mhi_BHI 0660 radio radio
+/dev/mhi_LOOPBACK 0660 radio radio
+/dev/mhi_QMI0 0660 radio radio
+
+/dev/stty_nr* 0660 radio radio
+/dev/spipe_nr* 0660 radio radio
+/dev/snv_nr 0660 radio radio
+/dev/sdiag_nr 0660 radio radio
+/dev/slog_nr 0660 radio radio
2. selinux 权限
--- a/device/rockchip/common/sepolicy/private/file_contexts
+++ b/device/rockchip/common/sepolicy/private/file_contexts
@@ -3,3 +3,17 @@
# All Rockchip configs
/data/misc/cfg_rockchip(/.*)? u:object_r:rockchip_config_data_file:s0
+
+# quectel port
+/dev/ttyUSB[0-9] u:object_r:radio_device:s0
+/dev/ttyACM[0-9] u:object_r:radio_device:s0
+/dev/cdc-wdm[0-9] u:object_r:radio_device:s0
+/dev/qcqmi[0-9] u:object_r:radio_device:s0
+/vendor/bin/hw/rild u:object_r:rild_exec:s0
+/dev/socket/rildOemHook u:object_r:rild_socket:s0
+#PCIe
+/dev/mhi_DUN u:object_r:radio_device:s0
+/dev/mhi_DIAG u:object_r:radio_device:s0
+/dev/mhi_BHI u:object_r:radio_device:s0
+/dev/mhi_LOOPBACK u:object_r:radio_device:s0
+/dev/mhi_QMI0 u:object_r:radio_device:s0
3.rild.te文件
--- a/system/sepolicy/vendor/rild.te
+++ b/system/sepolicy/vendor/rild.te
@@ -6,4 +6,7 @@ net_domain(rild)
# type_transition must be private policy the domain_trans rules could stay
# public, but conceptually should go with this
type rild_exec, exec_type, vendor_file_type, file_type;
+
+allow rild self:packet_socket { create bind write read };
+
init_daemon_domain(rild)
4. 修改usb节点名称
system/core
--- a/system/core/init/devices.cpp
+++ b/system/core/init/devices.cpp
@@ -550,6 +550,12 @@ void DeviceHandler::HandleUevent(const Uevent& uevent) {
int device_id = uevent.minor % 128 + 1;
devpath = StringPrintf("/dev/bus/usb/%03d/%03d", bus_id, device_id);
}
+
+#if 1 //add by quectel for mknod /dev/cdc-wdm0
+ } else if (uevent.subsystem == "usbmisc" && !uevent.device_name.empty()) {
+ devpath = "/dev/" + uevent.device_name;
+#endif
+
} else if (StartsWith(uevent.subsystem, "usb")) {
// ignore other USB events
return;
2.4 添加libreference.so
移远提供ril库: Quectel_Android_RIL_Driver_V3.5.66.zip
--- a/vendor/rockchip/common/phone/phone.mk
+++ b/vendor/rockchip/common/phone/phone.mk
@@ -17,6 +17,11 @@ PRODUCT_COPY_FILES += \
$(CUR_PATH)/phone/lib/libril-dts4108c.so:system/lib/libril.so
endif
+PRODUCT_COPY_FILES += \
+ $(CUR_PATH)/phone/lib/libreference-ril-quectel.so:vendor/lib64/hw/libreference-ril-quectel.so \
+ $(CUR_PATH)/phone/lib/libril.so:vendor/lib64/libril.so \
+ $(CUR_PATH)/phone/etc/ql-ril.conf:system/etc/ql-ril.conf
+
3. 编译及运行报错处理
3.1 android.hardware.radio@1.5::IRadio相关报错
相关报错:init: Control message: Could not find 'android.hardware.radio@1.5::IRadio/slot1' for ctl.interface_start from pid: 149 (/system/bin/hwservicemanager)
--- a/system/core/init/init.cpp
+++ b/system/core/init/init.cpp
@@ -435,9 +435,13 @@ static bool HandleControlMessage(std::string_view message, const std::string& na
service = ServiceList::GetInstance().FindService(name);
}
+ char tmp[256];
+ strcpy(tmp,name.c_str());
if (service == nullptr) {
- LOG(ERROR)
+
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
