## SIMCOM_7600CE 4GNDIS驱动 ### 问题默认插上4G模块无法正常上网 能感应到USB设备插入 问官方要到了安卓11得驱动包和文档 尝试移植 百度也有一篇简要得移植文章 针对6.0得 https://blog.csdn.net/weixin_44127587/article/details/115207908 文档中第一步提到得LINUX内核配置文件 我全局搜索出来是这 看来和源码本身没关系 源码默认USB支持各种模式也都编译了 配置中配置来决定是否打包进去 out/target/product/Tinker_Board_2/obj/PACKAGING/check_vintf_all_intermediates/kernel_configs.txt CONFIG_USB_WDM=y CONFIG_USB_USBNET=y CONFIG_USB_NET_QMI_WWAN=y CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y 以上配置并不连续在一起 分别查找确认了 默认都是y 第二步 网文 >修改驱动文件, 增加7600模块的VID和PID ,并且跳过 Interface 5, 路径一般为 linux-3.10/drivers/usb/serial/option.c 模块文档中 >配置预留 NDIS 串口: 文件路径:kernel/drivers/usb/serial/option.c; 在 static const struct usb_device_id option_ids[]数组中添加我们的串口信息,其中包 括设备 ID(VID、PID),以及需要跳过的设备。 需要跳过的设备:在同一个设备 ID 下面,可能存在多个设备(同一个物理 USB 口 虚拟出多个模拟端口);设置一个黑名单,可以把不需要配置成串口的模拟口屏蔽掉, 这样就不会被映射为串口。 串口配置:kernel/drivers/usb/serial/option.c; Android 配置中需要个人添加 blacklist 结构(可以只添加自己需要的 PID、VID): 我看安卓11版本里已经有了9001得配置 所以没改 新增了9011得识别 46行 ``` # mk added for simcom7600 /dev/ttyUSB* 0666 radio radio # mk added end ``` kernel/drivers/net/usb/Makefile 4G 模块驱动文件:simcom_wwan.c 5G 模块驱动文件:qmi_wwan_simcom_1e0e_9001.c 我选择了4G模块驱动文件放入编译 注释掉原来的qmi驱动 ``` #obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o obj-$(CONFIG_USB_USBNET) += usbnet.o simcom_wwan.o #qmi_wwan_simcom_1e0e_9001.o ``` 至此编译后系统有usb0 但是不会自动配置 手动配置IP掩码网关之后接口能正常上网 模块正常工作 系统LINUX层驱动工作正常 缺自动配置工具 自己写脚本也行 自动rndis配置方法 build/make/core/main.mk 加ADDITIONAL_BUILD_PROPERTIES += rild.simcom.rndis=1 我选择在 374行 ADDITIONAL_BUILD_PROPERTIES += net.bt.name=Android 后加 ``` BUILD_WITHOUT_PV := true ADDITIONAL_BUILD_PROPERTIES += net.bt.name=Android #line 374 #add by mk for simcom ADDITIONAL_BUILD_PROPERTIES += rild.simcom.rndis=1 ADDITIONAL_BUILD_PROPERTIES += net.usb0.dns2=114.114.114.114 #add by mk for simcom end ``` 我顺手把DNS配置也加了 自动模式获取得DNS是7600得网关 192.168.255.1 实测不能完成DNS解析 但是安卓应用层 默认并不会带上 telephony组件 短信电话4G模块都没有 第三步 想办法尝试把telephony组件编译进去 让安卓启动后多出这些APP device/asus/tinker_board_2/BoardConfig.mk BOARD_HAS_RK_4G_MODEM 设置位true 默认是false ``` #for rk 4g modem BOARD_HAS_RK_4G_MODEM ?= true ifeq ($(strip $(BOARD_HAS_RK_4G_MODEM)),true) DEVICE_MANIFEST_FILE += device/rockchip/common/4g_modem/manifest.xml endif ``` device/asus/tinker_board_2/WW_Tinker_Board_2.mk 要加在前面否则会有变量初始化错误 ``` $(call inherit-product, $(SRC_TARGET_DIR)/product/telephony.mk) ``` 修改 build/target/product/telephony_vendor.mk 增加 messaging \ 默认不包含短信模块 PRODUCT_PACKAGES := \ rild \ messaging \ PRODUCT_COPY_FILES := \ 第四步 替换原版rild层驱动为厂商提供得驱动 /system/core/rootdir/init.rc 和/hardware/ril/rild.rc 启动脚本加载库-l /vendor/lib64/libreference-ril.so ``` service vendor.ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril.so ``` hardware/ril/rild hardware/ril/refrence-ril 这两个库 有原装的 但是我们要换成自己4G模块提供的 simcom的驱动 有些资料的做法是改掉android.mk的名字让他不编译 然后自己把文件放到out目录中 我测试失败后就考虑还是让他生成打包(失败原因是不编译也意味着不打包了如果只是依赖得文件还好,但是也包括rild.rc等相关文件不知道会少打包啥 所以留着 我们会写拷贝发布配置) 写copyfile规则 vendor目录下新建simcom文件夹放入厂商给的驱动 device/asus/tinker_board_2/WW_Tinker_Board_2.mk 加上 PRODUCT_COPY_FILES += vendor/simcom/rild:/vendor/bin/hw/rild PRODUCT_COPY_FILES += vendor/simcom/libril.so:/vendor/lib64/libril.so PRODUCT_COPY_FILES += vendor/simcom/libreference-ril.so:/vendor/lib64/libreference-ril.so rild.libpath = /vendor/lib64/libreference-ril.so 这里还会打包失败 编译环境很严格 会检测到重复发布得包 规则验证不通过(因为要拷贝得rild和libreference本身会编译发布 我们copy相当于是重复发布来覆盖他) 修改编译配置把严格模式改成允许重复发布 在device/asus/tinker_board_2/BoardConfig.mk 末尾加上 ``` BUILD_BROKEN_DUP_RULES := true ``` 第五步 设置默认网络模式和开启语音短信等配置选项 frameworks/base/telephony/java/com/android/internal/telephony/RILConstants.java 默认网络设置4G NETWORK_MODE_WCDMA_PREF 9 ``` @UnsupportedAppUsage int PREFERRED_NETWORK_MODE = Optional.of(TelephonyProperties.default_network()) .filter(list -> !list.isEmpty()) .map(list -> list.get(0)) .orElse(NETWORK_MODE_LTE_GSM_WCDMA); //.orElse(NETWORK_MODE_WCDMA_PREF); ``` packages/services/Telephony/res/values/config.xml 中 ``` true ``` device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml ``` true true ``` 默认都是false 改成true 第六步 最后遇到问题调试方法 手动抓 log 保存到文件: RIL 的 log: adb logcat -b radio -v time >radio.txt GPS/pppd/CM: adb logcat -v time >main.txt 如果设备和 PC 间是串口连接, 进入串口 shell 模式后执行 Logcat –b radio –v time Logcat –v time 把打印出的 log 存成文件 adb抓 可以保存到win主机上用BareTailPro动态查看log文件就好了 就跟终端输出一样 文件推送上传 把 ril 库的相关文件推送到 android 对应的目录(添加开机脚本时一定要对应路径) 若是手动 push 到系统,首先要重新挂载设备: 因为默认权限是只读的 ```PowerShell adb root && adb remount (低版本 android 或者 mount -o remount,rw /system) adb push ./rild /vendor/bin/hw/ adb shell chmod 777 /vendor/bin/hw/rild #Simcom Android ril 适配 adb push ./libril.so /vendor/lib64/ adb push ./libreference-ril.so /vendor/lib64/ ```