4G模块NDIS驱动.md 7.3 KB

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 中

<bool name="config_enabled_lte" translatable="false">true</bool>

device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml

    <!-- This device is not "voice capable"; it's data-only. -->
    <bool name="config_voice_capable">true</bool>

    <!-- This device does not allow sms service. -->
    <bool name="config_sms_capable">true</bool>

默认都是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 到系统,首先要重新挂载设备: 因为默认权限是只读的

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/