## 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/
```