|
楼主 |
发表于 2023-12-7 21:09
|
显示全部楼层
软件工具目录
ScanRort端口扫描工具,putty,tftpd64,WinSCP,MobaXterm_Personal,编程器驱动编程器软件,模块win驱动, 拿到路由现备份路由器固件EERROM固件查询设备参数
硬件:编程器,flash型号对应探针/烧录夹子
第一步 查找进入后台协议端口类型
连接电脑网口到路由器任一LAN口,打开ScanRort端口扫描工具
设置第1项为路由器IP地址(没有修改过便是路由器标签地址),
我的是192.168.1.1,设置第二项End lPAddress同第一项相同参数,
设置第三项scan Type为Scan Only Common Ports,点击右下角Start
显示框出现电脑图标跟IP,鼠标单机电脑图标前的〉会显示如下图
出现SSH或者Telnet,则直接打开putty或者MobaXterm_Personal
没有SSH,Telnet任一个自行百度如何打开SSH,Telnet,或者
用编程器,连接路由器主板串口进行TTL操作
第二步进入路由后台
1.使用putty,软件安装后出现多个图标,打开图片中标记的这个
打开putty填入路由器IP地址,连接类型根据第一步中显示已打开的端口连接类型选择
点击打开出现如下图输入超级管理员账号一般为ROOT,root,admin,ADMIN
密码为空,admin,password
密码填写一般不显示直接输入对的密码按回车键,进入后台如下:
2.使用MobaXterm_Personal
打开如下点击会话
会话打开如下
根据第一步选择连接类型,点击如下填入路由器IP地址跟超级管理员与密码进入后台
3没有SSH,Telnet用编程器,连接路由器主板进行TTL操作,编程器切换到TTL模式
1.安装编程器驱动,连接编程器与电脑打开一次编程器烧录软件或者
打开控制面板→打开设备→打开串口查看是否识别到了编程器TTL模式串口,识别到后,断开编程器与电脑连接,连接编程器与路由器主板串口,再接入电脑,设置串口波特率与设备匹配的波特率,一般为(115200/57600)
打开putty,连接类型选Serial(串口),修改串口号为编程器串口号,与波特率,点击打开,输入超级管理员与密码进入后台
第三步备份固件
进入后台备份固件操作有两种第一种putty配合WinSCP使用,第二种单MobaXterm_Persona
1.进入后台后输入命令cat /proc/mtd出现如下图分区表,截图记录分区信息
输入命令cat /dev/mtd? > /tmp/*?.bin
几个分区输入几次命令逐个分区进行备份,?代表分区号,*代表备份名称,每次都不同,对应各分区号名称,路由系统固件注意分区是U-BOOT,factory,firmware,
U-BOOT分区是路由器引导分区,刷不死UBOOT,或者breed都是刷该分区,factory分区是EEPROM固件分区存放路由器硬件信息与MAC地址,firmware是路由器固件分区,打开WinSCP,导出备份固件,打开WinSCP如下
V-文件类型选择已打开的SCP,填入路由IP账号密码点击登录如下点击箭头按钮返回
路由系统根目录如下
打开tmp文件夹找到备份的bin格式文件鼠标右键点击下载,保存在电脑目录即可
2.使用MobaXterm_Personal就比较方便了,登录后台如下
点击红色箭头部分后续操作如第一种方式操作相同
3.进入后台输入dmesg
保存打印出的路由日志信息
后台输入dmesg |grep spi |grep Kbytes查看flash芯片的型号大小,flash分nor 与nand两种,32MB及以下是nor 以上是nand类型存储芯片
输入cat /proc/meminfo |grep MemTotal查看运行内DDR的大小,保存信息
4.设备有4G/5G模块需增加一步如下
输入lsusb,正常会反馈usb接口设备信息,显示反馈错误代码则是没有安装相关插件,
需要手动安装插件安装usbutils安装pciutils安装minicom
usbutils插件读取显示USB通道设备,pciutils读取显示pcie通道设备,minicom插件设置查看串口通道信息,读取usb设备信息如下ID后面紧跟着的四位数字是厂商VID,冒号后面四位是设备的PID,系统能否读取到USB设备除了相关设备驱动外这两参数很重要,后期重新自己定制OPENWRT编译设备能否驱动也需要这两参数
输入ls /dev/ttyUSB*命令查看模块使能ttyUSB接口是否正常显示如下显示出带数字的ttyUSB接口说明使能接口成功
也可以输入ls /dev命令查看如下
到此拿到一个设备后需要从设备提取保存的相关资料已经整理完毕。
第四步给设备刷入不死uboot
不死uboor分u-boot与breed,u-boot对flash坏块兼容性较好,breed对设备操作功能较多坏块兼容性较差,不死uboot只是让路由器在刷固件不兼容的情况下可以多次刷新固件不至于成砖,并不是真的刷不坏,刷固件会导致flash出现坏块,坏块达到一定数量flash稳定性变差甚至导致路由器无法开机或者运行不稳定。
刷入breed需要在网上查看自己路由器soc或者叫cpu,再在breed作者网站https://breed.hackpascal.net查看是否有支持https://www.right.com.cn/forum/thread-161906-1-1.html
uboot官网ftp://ftp.denx.de/pub/u-boot/或者https://ftp.denx.de/pub/u-boot/
有具体路由器型号用路由器的没有找soc通用的,否则会变砖只拆机能用编程器烧录救砖
刷breed有三种第一种是不拆机 刷,第二种是拆机TTL刷写,第三种是编程器烧录刷写
一定一定要看清楚自己设备BREED的文件使用条件要求
不拆机刷breed,
ssh登入后,用passwd指令更换root密码
mtd被锁,所以无法直接刷机,通过打开openwrt的管理界面来刷机,
使用指令/etc/init.d/uhttpd enable && /etc/init.d/uhttpd start访问路由器IP,root的密码是刚才设置的重启后ssh登录路由后台, 使用WinSCP或者MobaXterm_Persona如上备份下载固件的地方上传或者拖拽breed到/tmp文件夹,然后mtd_write -r write /tmp/breed-mt7620-reset13.bin Bootloader即可刷入breed。
拆机编程器ttl模式刷breed
需要以下几款款软件1、SecureCRT软件2、putty软件2、Tftpd软件3、WinSCP软件,焊接TTL接口排针或者用跳线插针固定好使不要出现接触不灵松动断开连接就行,主板上有四个孔或者四个触点三圆一方,编程需在ttl模式下RX接路由器TX,TX接路由器RX,GND接GND,剩下一个3.3V或者5V不接一定不要接否则可能导致路由器烧坏。
进入控制面板 -> 网络和 Internet -> 网络连接里面设置一下网口的 IP地址(设成192.168.1.xxx,必须同一网段,因为路由的默认网关是192.168.1.1,设好后后面操作的 IP要对应回去)
将USB转串口插入电脑USB口,接着打开设备管理器可以看到串口设备,然后对这个设备进行这设置,如图
安装SecureCRT并打开软件,设置一下
接下来打开TFTP软件,默认是不需要设置的,注意这里需要把固件放在TFTP软件所在的目录,固件名称尽量短一些。
初次刷用 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory固件,如果已经是 openwrt的请刷 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade(固件不要用官方的,官方的登陆进去,没有界面显示的,用下面提供的固件)如图点击浏览选择breed文件目录,显示目录选择与路由设备连接的网卡
下面用网线把路由器和电脑连接,打开电源,会在SecureCRT里看到路由器的启动信息。在接通路由器电源的时候,迅速按 tpl三个字母(具体输入什么按自己的品牌网上查找)可以阻止路由器的启动(必须快速按,不然只能重新上电再来),直到出现命令输入的光标。如图(这里我没截到输入光标那里,因为我是刷完后截的
接下来就可以输入命令开始刷机了
命令行键入(回车键结束操作)
setenv ipaddr 192.168.1.1
setenv serverip 192.168.1.169(输入之前你设的 IP地址)
tftp 0x80000000 abc.bin (abc是你放在TFTP软件所在目录的固件名)
然后再输入,看上图
erase 0x9f020000 +0x3c0000
cp.b 0x80000000 0x9f020000 0x3c0000
最后,出现 done,就刷机成功了,也可用于救砖。
第五步刷机
在
https://openwrt.ai/?target=ramips%2Fmt76x8&id=asus_rt-ac1200
https://firmware-selector.openwrt.org/
两个网站任一一个下载相关设备的固件也可定制,没有自己型号的可以查找soc,2.4G,5G,flash,运行内存相同的机器刷入
breed使用教程如下,编程固件选项不要用
第六步如果没有固件只能自己移植编译固件了
准备工作
Linux系统(Ubuntu /debin/deepin),一块开发板,一根网线,tf卡和读卡器,良好的网络环境
得到DTB
首先我们需要得到开发板的DTB文件,这个文件是用来描述开发板硬件的,OpenWRT需要这个文件来驱动开发板的硬件。
要得到和我们所使用的内核兼容性比较好的DTB文件,我们可以编译Armbian的内核,再从内核的安装包中提取DTB文件,或者找到同硬件不同运行内存的路由器修改内存大小。
Armbian本身提供了这个Build工具,可以用来构建系统。因为我们只需要dtb文件,所以只构建内核就够了。
按照官方文档,首先输入这些命令:
apt-get -y install git
git clone https://github.com/armbian/build
cd build
./compile.sh
然后会出现一个菜单,选择U-boot and kernel packages,然后选择Do not change the kernel configuration
因为我使用的开发板只有社区的支持,所以要打开专家模式。用方向键右移,选择Show CSC/WIP/EOS/TVB,然后按Enter键,之后就进入了红色背景的警告,选择I understand and agree,然后按Enter键。
之后找到rockpi-e,选中,然后按Enter键。
版本选择current就可以了,之后按Enter键。
等待编译完成。期间要下载不少依赖,需要保证网络连接良好。
等待编译完成,找到output/debs目录,里面有一个类似于linux-dtb-current-rockchip64_22.11.0-trunk_arm64.deb的文件,这个就是我们需要的内核安装包。
之后在这个位置先mkdir dtb用dpkg -x linux-dtb-current-rockchip64_22.11.0-trunk_arm64.deb dtb命令解压这个安装包,在dtb/boot/dtb-5.15.71-rockchip64/rockchip/文件夹,里面就是我们需要的DTB文件dtb。
准备OpenWRT RootFS
这一步可以通过自行从源码编译OpenWRT来得到,也可以直接下载已经编译好的RootFS。我这里用已经编译好了的RootFS。
选择的是目前最新的稳定版21.02.1,使用了immortalwrt这个修改版,因为官方的源里面有很多常用的软件包,下载地址是这个。选择default-rootfs.tar.gz这个文件下载。
3. 构建OpenWRT
可以依靠openwrt_packit这个项目来完成项目的构建
3.1 准备工作
下载Flippy预编译好的内核,我这里使用的是dtb-5.4.28-rockchip-flippy-32+o.tar.gz、boot-5.4.28-rockchip-flippy-32+o.tar.gz、modules-5.4.28-rockchip-flippy-32+o.tar.gz。
把之前生成的dtb文件放到dtb-5.4.28-rockchip-flippy-32+o文件夹里面。我这里使用的是7zip,方法是先用scp把dtb文件下载到电脑,再用7zip打开dtb-5.4.28-rockchip-flippy-32+o.tar.gz,把dtb文件放到里面,之后关闭文件,应用修改。
之后在Ubuntu中创建/opt/kernel,把dtb-5.4.28-rockchip-flippy-32+o.tar.gz、boot-5.4.28-rockchip-flippy-32+o.tar.gz、modules-5.4.28-rockchip-flippy-32+o.tar.gz复制到/opt/kernel
3.2 开始构建
克隆项目
cd /opt
git clone https://github.com/unifreq/openwrt_packit
准备RootFS
把之前下载的RootFS复制到/opt/openwrt_packit,并重命名为openwrt-armvirt-64-default-rootfs.tar.gz
修改配置
打开硬件最接近的mk_rk3328_l1pro.sh
line 10, BOARD="l1pro"改为BOARD="rockpi-e"
line 139, fdtfile=/dtb/rockchip/rk3328-l1pro-1296mhz.dtb改为fdtfile=/dtb/rockchip/rk3328-rock-pi-e.dtb
关闭文件,重命名为mk_rk3328_rockpi-e.sh
打开make.env,line 48, KERNEL_VERSION="5.19.12-flippy-77+"改为5.4.28-rockchip-flippy-32+o
把/opt/kernel/中的dtb-5.4.28-rockchip-flippy-32+o.tar.gz重命名为dtb-rockchip-5.4.28-rockchip-flippy-32+o.tar.gz
开始构建
cd /opt/openwrt_packit
./mk_rk3328_rockpi-e.sh
构建完成后会在/opt/openwrt_packit/output中生成openwrt-rockpi-e_R22.9.1_k5.4.28-rockchip-flippy-32+o.img这个文件,这就是我们需要的OpenWRT镜像文件
或者查找同soc同2.4G/5G,工坊芯片的机器修改DTS
输入命令vi target/linux/ramips/dts/MT7620a.dts或者复制出DTS文件在WIN10/11/7系统下用Notepad软件工具编译memory@0 项,有修改无复制粘贴增加如下图红圈部分修改绿线标注的部分,每个分区只定分区大小根据之前提取的分区表修改修改分区顺序,及大小DTS路径根据下载的源代码定openwrt就是openwrt目录,lede就是lede目录,gitee克隆的就按下载的源代码目录来,以openwrt为例在openwrt/target/linux/ramips/dts红字部分需根据自己机器的SOC来选择构架以我的为例mt7621/7628是mips_24k构架选ramips,电脑则选x86,需要根据自己soc选择,修改完dts,备份源dts,把修改的dts复制到源dts路径替换
准备工作做完,开始做编译准备国内
Openwrt编译准备工作1.一台笔记本或台式2.一个ubuntu(debin/deepin)系统3.一台路由器4.自备手工竹T(编译的过程中会自动下载包,有些包在国外,手工竹T会报错导致编译失败)(重要!!)(重要!!)(重要!!)
更新一下系统软件sudo apt-get update (系统更新太慢,请自行替换ubuntu的源,自行百度。阿里的源不错)
安装openwrt编译需要的环境,以下操作均需在终端复制以下命令操作
sudo apt-get install gcc g++ build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch flex bison make autoconf texinfo unzip sharutils subversion ncurses-term zlib1g-dev ccache upx lib32gcc1 libc6-dev-i386 uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev libglib2.0-dev xmlto qemu-utils automake libtool -y
下载openwrt 源代码
mkdir openwrt#新建一个目录
sudo chmod 777 openwrt#修改权限(重要)
cd openwrt#进入目录
源码下载git clone https://gitee.com/openwrt-mirror/openwrt.git
源码更新 git clone -b openwrt https://github.com/openwrt/openwrt.git source
如下
更新软件
cd source
./scripts/feeds update -a
./scripts/feeds install -a
做完以上五步准备工作完成,准备开始进行编译
测试一下编译环境make defconfig
1.选择编译的平台以我的TP-6300为例子选择AR7XX/AR9XX
选择编译机型
添加一个luci WEB界面
*表示编译进固件里面按键Y或者按空格键改变选项,M表示只编译但不写到固件里面去按键N,(空) 留空表示不做任何操作,返回上一级双击左上角ESC键
给刚才的WEB界面添加一个中文语言包
选择完以保存即可,按键盘方向键右键选中save点击enter键保存生成.config文件,按右键选择Exit点击enter键退出配置界面。
最后一步生成固件
此步自备手工竹违禁词语(编译的过程中会自动下载包,有些包在国外,没手工竹违禁词语会报错导致编译失败)(重要!!)(重要!!)(重要!!)
make -j8 download V=s #下载dl库,编译成功率更高多次执行此命令使其没有遗漏的dl库否则会编译失败,第一次编译使用单线程编译make -j1 V=s不容易出错但是速度极慢
make -j(核心数) V=s核心数不要超过电脑的核心数不然电脑会卡死,一般在4个5个就行多的也没效果,电脑只是8G内存,第一次编译会在2~5个小时不等,二次编译速度会在一个小时到两个小时。
方法一:
①cd lede
②make clean (清除bin下面的以前编译的成果)
③git pull
④./scripts/feeds update -a && ./scripts/feeds install -a
⑤make menuconfig
⑥make -j2 V=s (几核就写-j几)
方法二:(看的esir的视频)
①cd lede
②git pull
③./scripts/feeds update -a
④./scripts/feeds install -a
⑤rm tmp -rf
⑥make menuconfig
⑦make clean (清除bin下面的以前编译的成果,make clean<make dirclean<make distclean<删除lede目录相当于首次编译)
⑧make -j2 V=s (几核就写-j几)
方法三:lean的github里的
①cd lede
②git pull
③./scripts/feeds update -a && ./scripts/feeds install -a
④make defconfig
⑤make -j8 download
⑥make -j$(($(nproc) + 1)) V=s
第七步适配4G/5G模块
输入lsusb,看识别是否被识别,查看驱动加载情况OpenWRT对3G/UMTS/4G/LTE/5G/Phone网卡的驱动方式,一共有以下几种:QMI,NCM,RNDIS,串口/专用驱动
查看dmesg信息,确认模块驱动加载情况。不同的4G/5G网卡,加载的驱动模式可能有差异。通常情况下,4G无线网卡包含两个模式,一个CD存储模式,另一个是Modem模式(调制解调器模式)。5G模块的无线网卡通常走USB Type-C,具有专门的驱动
dmesg命令
如果usb模式切换正常,通常可以看到输出内容包含:打印启动信息包含GSM modem否则,可能只识别到USB Storage device或者CD-ROM。这种情况下,需要安装usb-modeswitch等库,并设置切换网卡运行模式。如果只识别到USB设备而没有对应驱动,需要对OpenWRT内核编译选项进行配置。如果看到GSM相关字眼(跳过内核编译,说明固件已经支持该模块),那么直接执行ifconfig -a查看是否有wwan0或usb之类的网卡名称。执行RNDIS相关依赖安装:
opkg update
opkg install kmod-usb-net-rndis usb-modeswitch
重启后如果dmesg输出内容包含RNDIS device,则说明已经被识别为RNDIS设备,将匹配为一个安卓手机来进行上网同时ifconfig -a出现usb0网卡或者wwan0网卡内核编译选项
### USB Net Drivers
CONFIG_PACKAGE_kmod-usb-net=y
CONFIG_PACKAGE_kmod-usb-net-asix=y
CONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y
CONFIG_PACKAGE_kmod-usb-net-rtl8152=y
CONFIG_PACKAGE_kmod-usb-net-cdc-eem=y
CONFIG_PACKAGE_kmod-usb-net-cdc-ether=y
CONFIG_PACKAGE_kmod-usb-net-cdc-mbim=y
CONFIG_PACKAGE_kmod-usb-net-cdc-ncm=y
CONFIG_PACKAGE_kmod-usb-net-cdc-subset=y
CONFIG_PACKAGE_kmod-usb-net-dm9601-ether=y
CONFIG_PACKAGE_kmod-usb-net-hso=y
CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm=y
CONFIG_PACKAGE_kmod-usb-net-ipheth=y
CONFIG_PACKAGE_kmod-usb-net-kalmia=y
CONFIG_PACKAGE_kmod-usb-net-kaweth=y
CONFIG_PACKAGE_kmod-usb-net-mcs7830=y
CONFIG_PACKAGE_kmod-usb-net-pegasus=y
CONFIG_PACKAGE_kmod-usb-net-pl=y
CONFIG_PACKAGE_kmod-usb-net-qmi-wwan=y
CONFIG_PACKAGE_kmod-usb-net-rndis=y
CONFIG_PACKAGE_kmod-usb-net-sierrawireless=y
CONFIG_PACKAGE_kmod-usb-net-smsc95xx=y
CONFIG_PACKAGE_kmod-usb-net-sr9700=y
CONFIG_PACKAGE_kmod-usb-net2280=y
### USB Storage Drivers
CONFIG_PACKAGE_kmod-usb-ohci=y
CONFIG_PACKAGE_kmod-usb-ohci-pci=y
CONFIG_PACKAGE_kmod-usb-printer=y
CONFIG_PACKAGE_kmod-usb-storage=y
CONFIG_PACKAGE_kmod-usb-storage-extras=y
CONFIG_PACKAGE_kmod-usb-storage-uas=y
CONFIG_PACKAGE_kmod-usb-uhci=y
CONFIG_PACKAGE_kmod-usb2=y
CONFIG_PACKAGE_kmod-usb2-pci=y
CONFIG_PACKAGE_kmod-usb3=y
# 3G/4G/5G Drivers & Utilities
CONFIG_PACKAGE_comgt-ncm=y
CONFIG_PACKAGE_comgt=y
CONFIG_PACKAGE_kmod-mii=y
CONFIG_PACKAGE_kmod-usb-acm=y
CONFIG_PACKAGE_kmod-usb-serial=y
CONFIG_PACKAGE_kmod-usb-serial-option=y
CONFIG_PACKAGE_kmod-usb-serial-wwan=y
CONFIG_PACKAGE_luci-proto-3g=y
CONFIG_PACKAGE_luci-proto-ncm=y
CONFIG_PACKAGE_luci-proto-qmi=y
CONFIG_PACKAGE_qmi-utils=y
CONFIG_PACKAGE_umbim=y
CONFIG_PACKAGE_uqmi=y
CONFIG_PACKAGE_usb-modeswitch=y
# Mobile Network Sharing
CONFIG_PACKAGE_libimobiledevice-utils=y
CONFIG_PACKAGE_libplist-utils=y
CONFIG_PACKAGE_libudev-fbsd=y
CONFIG_PACKAGE_libusbmuxd-utils=y
CONFIG_PACKAGE_usbmuxd=y
# Kmods
CONFIG_PACKAGE_kmod-rtl8187=y
CONFIG_PACKAGE_kmod-rtl8188eu=y
CONFIG_PACKAGE_kmod-rtl8192c-common=y
CONFIG_PACKAGE_kmod-rtl8192cu=y
CONFIG_PACKAGE_kmod-rtl8192du=y
CONFIG_PACKAGE_kmod-rtl8812au-ac=y
CONFIG_PACKAGE_kmod-rtl8821cu=y
CONFIG_PACKAGE_kmod-rtl88x2bu=y
CONFIG_PACKAGE_kmod-rtlwifi=y
CONFIG_PACKAGE_kmod-rtlwifi-usb=y
CONFIG_PACKAGE_kmod-usb-net-rtl8150=y
CONFIG_PACKAGE_kmod-usb-net-rtl8152=y
上述配置项包含了常见的3G/4G/5G模块所依赖的配置信息。其中最为关键的是usb-modeswitch模块的配置。
驱动模块
常见的4G模块是通电即能联网,无需手工配置拨号信息。这类模块在ifconfig -a中直接体现了wwan0或usb之类的网卡名称。但由于OpenWRT默认没有对网卡启用DHCP Client,因此不会看到被分配的IP信息。这种情况下我们只需要在UI管理界面的接口-新建接口,输入一个你喜欢的wan口名称,并选择协议为DHCP客户端,选中对应的网卡,新建后修改-网卡防火墙,选择wan保存。之后就可以看到接口界面该网卡获得了IP地址,客户端即可正常上网
另外一种情况通常是给开发人员提供的4G/5G模块,是需要依赖一个上位机系统才能完成拨号并正常上网的。这类模块的表现就是直接给模块通电是无法正常上网的,需要配置拨号信息。例如移远等各类开发板使用的LTE模块、GL.iNet的各类LTE模块、给自助设备/嵌入式设备使用的4G模块、大部分的PCIe接口的LTE模块。这种情况需要使用qmi模块进行拨号上网。
opkg install usb-modeswitch kmod-mii kmod-usb-net kmod-usb-wdm kmod-usb-net-qmi-wwan uqmi luci-proto-qmi
安装上述模块后,进入GUI管理界面,接口-新建接口,输入一个你喜欢的wan口名称,并选择协议为QMI 蜂窝(不同版本翻译的名称不一样,带QMI即可),新建后修改-网卡防火墙,选择wan保存。修改,设备地址输入/dev/cdc-wdm0(通常是这个,看dmesg输出的结果),APN根据卡片来(联通 3gnet、移动 cmnet、电信ctnet)。保存后查看是否能成功拨号
上述方式是非编译固件方法,下述是编译固件方式
先查看模块在openwrt的option.c文件内核中是否支持,支持那种模式,支持,直接进行相关设置也无需编译,若内核已支持在命令终端中输入lsusb查看是否出现设备,然后输入命令cat /sys/kernel/debug/usb/devices查看设备驱动加载情况如下
如上图若绿色箭头与红色箭头显示的部分说明已经完全驱动,若绿色箭头有驱动显示说明内核已经支持红色箭头没有驱动,说明编译固件的时候option.c内核没有编辑添加相关使能接口代码,需执行命令echo " 2cb7 0a04" > /sys/bus/usb-serial/drivers/option1/new_id使option驱动识别添加ttyUSB*接口,但是重启会失效,就需要在启动脚本添加自启动命令使设备启动自动添加ttyUSB接口,启动脚本添加代码如下
需在MobaXterm_Personal中进行操作,启动脚本修改文件路径是/etc/rc.local如下图
在红圈exit 0上面添加自己想执行的代码即可,点击保存替换退出,赋予新文件权限输入代码chmod +x /etc/rc.local设置权限,否则无法激活开机启动,提示权限不足,输入reboot重启设备,重启设备后SSH登录后台输入ls /dev查看ttyUSB*接口是否正常显示,显示出接口后记录下来,根据模块AT指令手册发送查看模块信息反馈是否有IMEI码,有则驱动完整,无需要手动设置通讯端口号,有AT手册根据模式设置,无手册输入下列命令查找AT端口
chat -t 3 -e '' 'ATI' OK >> /dev/ttyUSB2 < /dev/ttyUSB2
红色数字需要从ttyUSB0~ttyUSB5逐个修改测试反馈如下图,说明是AT串口号,一般AT串口号+1是调制解调器端口号
从编译固件开始适配4G/5G模块如下操作
环境插件在Ubuntu安装以下插件:
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
Openwrt源码拉取
首先创建一个存放源码的目录,例如 sudo mkdir /data/Openwrt22.03/
然后执行命令:cd /data/Openwrt22.03/
执行: sudo git clone https://git.Openwrt.org/Openwrt/Openwrt.git命令
等待拉取源码完成,会在Openwrt22.03/目录下生成一个“source(也可能是openwrt)”的目录,所有的源码都在这个目录下 执行“sudo chmod 777 -R source/”命令给source目录设定权限,然后切换到source目录下,执行 “sudo git checkout”命令选择依据哪个版本进行编译,比如选择 “sudo git checkout v22.03.0”,表示使用Openwrt22.03版本的源码进行编译;
.执行“sudo ./scripts/feeds update -a”命令下载源码更新包,然后执行“sudo ./scripts/feeds install -a” 命令安装这些更新包
执行“sudo make defconfig”命令检查编译环境,只要不报错误环境就没问题,也可以省略这一步。
配置menuconfig
所有的编译工作不要在“root”用户下进行,一定要在新建的用户下进行。运行“sudo make menuconfig”进行配置,主要配置任务有,选择cpu型号、开发板型号、kmod模块、usb支持、需要的软件包等;配置完成后执行“sudo make FORCE_UNSAFE_CONFIGURE=1 -j1 V=99”命令进行编译,其中“FORCE_UNSAFE_CONFIGURE=1”是按照要求添加的权限参数;“-j1”是指定使用1个内核进行编译,编译过程中会体现具体的编译错误,也可以设置为编译环境系统的最大内核数“sudo make FORCE_UNSAFE_CONFIGURE=1 -j1 V=s”命令是继续编译,该命令应用在编译因报错终止排错后,再继续编译的情况。
配置kernel_menuconfig
1选择驱动版本“kernel_menuconfig”是配置内核参数,需要在完成一次正常的“menuconfig”编译之后,才可以执行“sudo kernel_menuconfig”的配置。
从厂家获取驱动包,选择与源码内核版本相近的官方驱动,例如Openwrt22.03内核版本是5.10.138,驱动版本选择5.10.11
2上传驱动配置文件将官方驱动文件option.c和usb_wwan.c文件上传至“[KERNEL]/drivers/usb/serial/”目录下,[KERNEL]路径分为x86平台和其他平台,按照实际情况上传,最简单的方法是使用“find / -name 文件名称”确认这个文件在哪,然后用官方文件替换掉。
3修改option.c文件
3-1添加模块的 VID 和 PID 信息:在文件[KERNEL]/drivers/usb/serial/option.c 中添加模块的 VID 和 PID 信息,如下所示:具体代码需根据自己模块信息指导手册修改
static const struct usb_device_id option_ids[] = {
#if 1 //Added by Quectel
{ USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x0900, 0xff, 0x00, 0x00) },
#endif
3-2增加复位恢复机制:对于 Linux 内核 3.5 及以上版本,请添加如下语句至文件[KERNEL]/drivers/usb/serial/option.c,如下所示
static struct usb_serial_driver option_1port_device = {
……
# ifdef CONFIG_PM
.suspend = usb_wwan_suspend,
.resume = usb_wwan_resume,
#if 1 //Added by Quectel
.reset_resume = usb_wwan_resume,
#endif
#endif
};
4修改usb_wwan.c文件
4-1添加 USB 零包机制:对 于 Linux 内 核 2.6.35 及以上版本,在相应的位置删除原来的语句,请添加如下语句至文件[KERNEL]/drivers/usb/serial/usb_wwan.c ,如下所示
static struct urb *usb_wwan_setup_urb(struct usb_serial *serial, int endpoint,
int dir, void *ctx, char *buf, int len,void (*callback) (struct urb *))
{……
usb_fill_bulk_urb(urb, serial->dev,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);
#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;
}
5配置kernel_menuconfig:为了使用 USB 转串口 option 驱动,必须使能以下 Linux 内核配置项,其它配置按需设置即可;
CONFIG_USB_SERIAL
CONFIG_USB_SERIAL_WWAN
CONFIG_USB_SERIAL_OPTION
执行“sudo make kernel_menuconfig”命令,在“> Device Drivers > Network device support > USB Network Adapters > Multi-purpose USB Networking Framework”路径下选择下图中的选项,注意不同的Openwrt版本该路径可能不一致,但是一定要开启下图中的选项:
(此处可忽略不看USB 串口驱动添加系统组件
1、内核选中USB driver for GSM and CDMA modems 组件,增加设备支持打开内核源码文件ption.c({kernel/drivers/usb/serial/option.c)。在option_ids数组添加FM650的PID/VID。注意 ECM/NCM/RNDIS 等不同模式下的 PID 是不一样的。需要根据模 组的模式添加相应的 PID/VID(请参考 USB 端口章节),或者可以把 FM650 支持的所有模式 ID 都添加上去。在 USB 串口驱动中,过滤 ECM/NCM/RNDIS 接口。由于 USB 串口跟 ECM/NCM/RNDIS 都属于 非标准 CDC 设备,需要防止 ECM/NCM/RNDIS 口被 USB 串口驱动加载而导致无法正常加载 ECM/NCM/RNDIS 口驱并在 probe 函数内判断当前的 interface num 进行过滤内核环境确认
ECM/NCM 是一种标准的设备间以太网帧数据交换协议,系统中需要加载 CDC ETHER 驱动,RNDIS 需要配置 CONFIG_USB_NET_RNDIS_HOST 请参考如下步骤CONFIG_USB_NET_CDCETHER=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_RNDIS_HOST = y。
内驱需要添加如下驱动如果是 ECM 模式,选择:
CDC Ethernet support(smart devices such as cable modems)
如果是 NCM 模式,选择:
CDC Ethernet support(smart devices such as cable modems)
CDC NCM Support 如果是 RNDIS 模式,选择:Host for RNDIS and ActiveSync devices)
usb项选配:
Make menuconfig配置:执行“make menuconfig”命令,配置usb选项,其它配置按需设置即可;
强行Kmod MD5修改因在编译的时候配置选项与官方不一致,会导致MD5发生变化,编译完成后只要涉及Kmod模块安装的插件都无法进行安装,因此在编译之前需要强制官方MD5进行编译。定义MD5在源码目录下创建“.vermagic”文件,并将对应版本及平台的kmod MD5写到该文件中,md5从“https://downloads.openwrt.org/releases/”网站对应平台下kmod目录下获取;
修改kernel-defaults.mk文件
修改Makefile文件修改package/kernel/linux/Makefile 文件,指定生成ipk包的MD5依赖,将原来27行语句替换为“STAMP_BUILT:=$(STAMP_BUILT)_$(shell cat $(LINUX_DIR)/.vermagic)”,如下图:
配置gpio实现喂狗某些开发板可能带狗,需要进行喂狗操作。使用“sudo find / -name mt7621.dtsi”找到“ mt7621.dtsi”文件进行修改,将258行设置为function=”gpio”; 如下图:到此修改文件完成编译固件。
固件编译完成在SSH命令拨号如下
1:输入命令lsusb查看模块是否识别,识别成功输入ls /dev查看ttyUSB*接口
输入命令chat -t 3 -e '' 'ATI' OK >> /dev/ttyUSB2 < /dev/ttyUSB2查看模块相关信息
输入命令chat -t 3 -e '' 'AT+GTUSBMODE?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2查看模块模式
输入命令chat -t 3 -e '' 'AT+GTUSBMODE=?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2修改模块模式?具体是多少需根据模块手册修改,
输入命令chat -t 3 -e '' 'AT+CFUN=15' OK >> /dev/ttyUSB2 < /dev/ttyUSB2模块重启生效,修改模式后AT串口会改变执行第一条命令同时修改ttyUSB*端口号查找AT端口回执回复OK没有其他跟乱码说明AT串口号是对的,
输入命令chat -t 3 -e '' 'AT+CGSN?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2查询 IMEI每个模块唯一
输入命令chat -t 3 -e '' 'AT+CFSN?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2查询批次号 SN
输入命令chat -t 3 -e '' 'AT+CFUN?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2回复+CFUN: 1 确认模块正常工作模式。不是 1 则设置成 1
输入命令chat -t 3 -e '' 'AT+CGMR?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2查询模块当前的固件版本号
输入命令chat -t 3 -e '' 'AT+CPIN?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2回复+CPIN: READY 说明识别到 SIM 卡
如果需要 PIN 码输入命令chat -t 3 -e '' ' AT+CPIN' OK >> /dev/ttyUSB2 < /dev/ttyUSB2则先用 AT+CPIN 按 AT 手册设置 PIN 码
输入命令chat -t 3 -e '' 'AT++CSQ' OK >> /dev/ttyUSB2 < /dev/ttyUSB2确认信号是否正常返回值+CSQ: <rssi>,<ber> 第一个参数 <rssi>大于 0 并且不是 99。
输入命令chat -t 3 -e '' 'AT+AT+CREG?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2命令确认已经
注册到 CS 域查询结果是 1 或者 5 表示注册上 CS 域
输入命令chat -t 3 -e '' 'AT+CGREG? /AT+CEREG?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2确认已经注册到 PS 域/4G查询结果是 1 或者 5 表示注册上 PS 域
输入命令chat -t 3 -e '' 'AT+CGDCONT' OK >> /dev/ttyUSB2 < /dev/ttyUSB2设置APN
输入命令chat -t 3 -e '' 'AT+GTRNDIS=1,1' OK >> /dev/ttyUSB2 < /dev/ttyUSB2 激活模块拨号
输入命令chat -t 3 -e '' 'AT+GTRNDIS=?' OK >> /dev/ttyUSB2 < /dev/ttyUSB2确认拨号情况是否获得IP
输入命令chat -t 3 -e '' 'AT+GTRNDIS=0,1' OK >> /dev/ttyUSB2 < /dev/ttyUSB2释放IP断开联网
下面是WINDOWS安装模块驱动,模块安装在转接板开发板上WINDOWS拨号上网的方式
线安装模块驱动,连接模块转接板到电脑,在控制面板→设备管理→会出现COM端口打开找到带AT字符的端口就是AT命令串口,下载sscom5.13.1打开如下
红色箭头部分按设备管理器里面的AT串口修改,右侧回车打钩
命令框输入ATI命令如下反馈检测到SIM卡则表示正常
依次输入AT+CFUN? 回复+CFUN: 1 确认模块正常工作模式。不是 1 则设置成 1
AT+CPIN?命令确认 SIM 卡回复+CPIN: READY 说明识别到 SIM 卡
AT+CSQ返回值+CSQ: <rssi>,<ber> 第一个参数 <rssi>大于 0 并且不是 99确认信号是否正常
AT+CREG?命令确认已经注册到 CS 域查询结果是 1 或者 5 表示注册上 CS 域
AT+CGREG? /AT+CEREG?确认已经注册到 PS 域/4G查询结果是 1 或者 5 表示注册上 PS 域
AT+CGDCONT 设 APN
AT+GTRNDIS=1,1 激活模块拨号上网
AT+GTRNDIS?查看是否已连接获取到IP
AT+GTRNDIS=0,1释放IP断开网络
AT+CFUN=15重启模块(重启命令需根据各厂模块而定不是统一的,我的是广和通的FM650使用的是此命令)
安装插件命令opkg install ?.ipk --force-depends符号?是插件名称
流量卡办理地址
https://haokawx.lot-ml.com/Product/Index/123121
Ubunut22.04编译固件需要更新如下
sudo apt update sudo apt install build-essential clang flex bison g++ gawk gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget
Openwrt源码拉取
1.首先创建一个存放源码的目录,例如 sudo mkdir /data/Openwrt22.03/;
2.然后执行命令:cd /data/Openwrt22.03/;
3.执行: sudo git clone https://git.Openwrt.org/Openwrt/Openwrt.git命令,
等待拉取源码完成,会在Openwrt22.03/目录下生成一个“source(也可能是openwrt)”的目录,所有的源码都在这个目录下;
4.执行“sudo chmod 777 -R source/”命令给source目录设定权限,然后切换到source目录下,执行 “sudo git checkout”命令选择依据哪个版本进行编译,比如选择 “sudo git checkout v22.03.0”,表示使用Openwrt22.03版本的源码进行编译;
5.执行“sudo ./scripts/feeds update -a”命令下载源码更新包,然后执行“sudo ./scripts/feeds install -a” 命令安装这些更新包;
6.执行“sudo make defconfig”命令检查编译环境,只要不报错误环境就没问题,也可以省略这一步
三、配置menuconfig
1.所有的编译工作不要在“root”用户下进行,一定要在新建的用户下进行;
2.运行“sudo make menuconfig”进行配置,主要配置任务有,选择cpu型号、开发板型号、kmod模块、usb支持、需要的软件包等;
3.配置完成后执行“sudo make FORCE_UNSAFE_CONFIGURE=1 -j1 V=99”命令进行编译,其中“FORCE_UNSAFE_CONFIGURE=1”是按照要求添加的权限参数;“-j1”是指定使用1个内核进行编译,编译过程中会体现具体的编译错误,也可以设置为编译环境系统的最大内核数;
4.“sudo make FORCE_UNSAFE_CONFIGURE=1 -j1 V=s”命令是继续编译,该命令应用在编译因报错终止排错后,再继续编译的情况。
五、 4G/5G网卡驱动编译
1.选择驱动版本
从厂家获取驱动包,选择与源码内核版本相近的官方驱动,例如Openwrt22.03内核版本是5.10.138,驱动版本选择5.10.11
2.上传驱动配置文件
将官方驱动文件option.c和usb_wwan.c文件上传至“[KERNEL]/drivers/usb/serial/”目录下,[KERNEL]路径分为x86平台和其他平台,按照实际情况上传,最简单的方法是使用“find / -name 文件名称”确认这个文件在哪,然后用官方文件替换掉。
3.修改option.c文件
3.1添加模块的 VID 和 PID 信息
在文件[KERNEL]/drivers/usb/serial/option.c 中添加模块的 VID 和 PID 信息,如下所示:
static const struct usb_device_id option_ids[] = {
#if 1 //Added by Quectel
{ USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x0900, 0xff, 0x00, 0x00) },
#endif
3.2增加复位恢复机制
对于 Linux 内核 3.5 及以上版本,请添加如下语句至文件[KERNEL]/drivers/usb/serial/option.c,如下所示:
static struct usb_serial_driver option_1port_device = {
……
# ifdef CONFIG_PM
.suspend = usb_wwan_suspend,
.resume = usb_wwan_resume,
#if 1 //Added by Quectel
.reset_resume = usb_wwan_resume,
#endif
#endif
};
4.修改usb_wwan.c文件
4.1添加 USB 零包机制
对 于 Linux 内 核 2.6.35 及以上版本,在相应的位置删除原来的语句,请添加如下语句至文件[KERNEL]/drivers/usb/serial/usb_wwan.c ,如下所示:
static struct urb *usb_wwan_setup_urb(struct usb_serial *serial, int endpoint,
int dir, void *ctx, char *buf, int len,void (*callback) (struct urb *))
{……
usb_fill_bulk_urb(urb, serial->dev,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);
#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;
}
5.配置kernel_menuconfig
为了使用 USB 转串口 option 驱动,必须使能以下 Linux 内核配置项,其它配置按需设置即可;
CONFIG_USB_SERIAL
CONFIG_USB_SERIAL_WWAN
CONFIG_USB_SERIAL_OPTION
执行“sudo make kernel_menuconfig”命令,在“> Device Drivers > Network device support > USB Network Adapters > Multi-purpose USB Networking Framework”路径下选择下图中的选项,注意不同的Openwrt版本该路径可能不一致,但是一定要开启下图中的选项:
usb项选配
六、Make menuconfig配置
执行“make menuconfig”命令,配置usb选项,其它配置按需设置即可;
七、Kmod MD5修改
因在编译的时候配置选项与官方不一致,会导致MD5发生变化,编译完成后只要涉及Kmod模块安装的插件都无法进行安装,因此在编译之前需要强制官方MD5进行编译。
1.定义MD5
在源码目录下创建“.vermagic”文件,并将对应版本及平台的kmod MD5写到该文件中,md5从“https://downloads.openwrt.org/releases/”网站对应平台下kmod目录下获取;
3.修改kernel-defaults.mk文件
3.修改Makefile文件
修改package/kernel/linux/Makefile 文件,指定生成ipk包的MD5依赖,将原来27行语句替换为“STAMP_BUILT:=$(STAMP_BUILT)_$(shell cat $(LINUX_DIR)/.vermagic)”,如下图:
八、配置gpio实现喂狗
某些开发板可能带狗,需要进行喂狗操作。使用“sudo find / -name mt7621.dtsi”找到“ mt7621.dtsi”文件进行修改,将258行设置为function=”gpio”; 如下图
九、错误排除
错误1:
Configuring ppp-mod-pppoe.
Collected errors:
check_data_file_clashes: Package libustream-openssl20201210 wants to install file /data/Openwrt22.03/Openwrt/build_dir/target-x86_64_musl/root-x86/lib/libustream-ssl.so
But that file is already provided by package * libustream-wolfssl20201210
opkg_install_cmd: Cannot install package libustream-openssl20201210.
make[2]: [package/Makefile:70: package/install] Error 255
make[2]: Leaving directory '/data/Openwrt22.03/Openwrt'
make[1]:[package/Makefile:111: /data/Openwrt22.03/Openwrt/staging_dir/target-x86_64_musl/stamp/.package_install] Error 2
make[1]: Leaving directory '/data/Openwrt22.03/Openwrt'
make: *** [/data/Openwrt22.03/Openwrt/include/toplevel.mk:230: world] Error 2
排除方法:在menuconfig配置里面去掉“libustream-wolfssl”勾选。先在“LuCI > Collections > ”路径下去掉“luci-ssl”的勾选,然后去“Libraies”路径下去掉“libustream-wolfssl”勾选,保存配置退出后继续编译。
错误2:
ERROR: module '/data/Openwrt22.03/Openwrt/build_dir/target-mipsel_24kc_musl/linux-ramips_mt7621/linux-5.10.138/arch/mips/crypto/chacha-mips.ko' is missing.
make[3] [modules/crypto.mk:501: /data/Openwrt22.03/Openwrt/bin/targets/ramips/mt7621/packages/kmod-crypto-lib-chacha20_5.10.138-1_mipsel_24kc.ipk] Error 1
make[3]: Leaving directory '/data/Openwrt22.03/Openwrt/package/kernel/linux'
time: package/kernel/linux/compile#4.29#0.81#4.61
ERROR: package/kernel/linux failed to build.
make[2]: *** [package/Makefile:116: package/kernel/linux/compile] Error 1
make[2]: Leaving directory '/data/Openwrt22.03/Openwrt'
make[1]: *** [package/Makefile:110: /data/Openwrt22.03/Openwrt/staging_dir/target-mipsel_24kc_musl/stamp/.package_compile] Error 2
make[1]: Leaving directory '/data/Openwrt22.03/Openwrt'
make: *** [/data/Openwrt22.03/Openwrt/include/toplevel.mk:230: world] Error 2
ubuntu@ubuntu-virtual-machine:/data/Openwrt22.03/Openwrt$ build_dir/target-mipsel_24kc_musl/linux-ramips_mt7621/linux-5.10.138/arch/mips/crypto/chacha-mips.ko' is missingmodules/crypto.mk:501: /data/Openwrt22.03/Openwrt/bin/targets/ramips/mt7621/packages/kmod-crypto-lib-chacha20_5.10.138-1_mipsel_24kc.ipk] Error 1mips/crypto/chacha-mips.ko' is missing.
-bash: build_dir/target-mipsel_24kc_musl/linux-ramips_mt7621/linux-5.10.138/arch/mips/crypto/chacha-mips.ko is missingmodules/crypto.mk:501: /data/Openwrt22.03/Openwrt/bin/targets/ramips/mt7621/packages/kmod-crypto-lib-chacha20_5.10.138-1_mipsel_24kc.ipk] Error 1mips/crypto/chacha-mips.ko: No such file or directory
ubuntu@ubuntu-virtual-machine:/data/Openwrt22.03/Openwrt$
ubuntu@ubuntu-virtual-machine:/data/Openwrt22.03/Openwrt$
排除方法:执行“sudo make kernel_menuconfig”,在“ Cryptographic API”目录下选择缺少的chacha*插件,保存退出继续编译。
十、测试
固件编译完成后会存放到openwrt/目录下的bin/目录下,刷入设备测试自己所需的功能。如果设备带有4G或5G模组,首先查看/dev目录下是否有ttyUSB*的设备,如果出现ttyUSB*的选项,说明4G或5G模组的驱动编译成功,然后根据官方提供的AT命令调试手册进行调试即可。
另外,如果有带狗的开发板需要进行喂狗配置
|
|