前言

编译不同版本的Openwrt一定要使用新的Ubuntu20.04搭建编译环境,如果利用之前编译过其它版本Openwrt的系统环境,新编译的版本会出现异常多的错误且不一定能排除。编译过程需要了解以下几点:

1. kernel_menuconfig的配置,这个模块可以理解为内核本身,需要开启内核支持的操作在这完成,例如开启mpls支持、vrf支持等;

2. menuconfig的配置,这个模块可以理解为应用模块,系统要安装的软件可以在这里选择源码进行编译安装,根据个人需求选择源码进行编译即可;

3. dl目录。系统在编译过程中,会在Openwrt源码的根目录下生成dl目录,用来存放编译过程中下载的程序源码。在第一次编译需要先下载要编译的程序源码,由于某些源码需要连接国外服务器下载,有可能会出现下载缓慢甚至下载失败的情况,可以百度搜索当前版本dl库源码包,下载后手动上传到dl目录下,再继续编译。

4. 错误排查。Openwrt第一次编译过程中,可能会出现各种各样的报错,这就需要耐心分析,配合百度搜索加一点自己的悟性进行排错,错误排除后再继续进行编译。

5. 文件目录问题。同一个源码在x86平台和其他平台下编译,同一个文件的路径是不一样的,最简单的方法就是使用“sudo find / -name 文件名”命令进行查找这个文件,会显示出当前平台该文件的路径。

一、编译环境搭建

1. 环境系统

Ubuntu20.04

CPU 16;内存32;硬盘200G

2. 环境插件

Ubuntu20.04安装以下插件:

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

个别插件因为软件源的问题不能直接使用apt-get命令进行安装,可以更换软件源或网上找到插件链接使用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”命令是继续编译,该命令应用在编译因报错终止排错后,再继续编译的情况。

四、配置kernel_menuconfig

“kernel_menuconfig”是配置内核参数,需要在完成一次正常的“menuconfig”编译之后,才可以执行“sudo kernel_menuconfig”的配置。

五、移远RM500 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版本该路径可能不一致,但是一定要开启下图中的选项:

述(最多18字

usb项选配:

六、Make menuconfig配置

执行“make menuconfig”命令,配置usb选项,其它配置按需设置即可;

七、Kmod MD5修改

因在编译的时候配置选项与官方不一致,会导致MD5发生变化,编译完成后只要涉及Kmod模块安装的插件都无法进行安装,因此在编译之前需要强制官方MD5进行编译。

1.定义MD5

在源码目录下创建“.vermagic”文件,并将对应版本及平台的kmod MD5写到该文件中,md5从“https://downloads.openwrt.org/releases/”网站对应平台下kmod目录下获取;

2.修改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命令调试手册进行调试即可。

另外,如果有带狗的开发板需要进行喂狗配置。

举报/反馈

guoxichao

1925获赞 64粉丝
小故事分享,茶余饭后来看看,喜欢的话记得关注哦!
关注
0
0
收藏
分享