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) +
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。