1、配置psi-nor为驱动模块
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<M> SPI NOR device support --->
2、进入内核加载
modpro and insmod xxx.ko
spi-nor.ko
1、配置psi-nor为驱动模块
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<M> SPI NOR device support --->
2、进入内核加载
modpro and insmod xxx.ko
spi-nor.ko
注:此文转载openwrt wiki
为了全面了解如何添加新设备支持,我们建议您查看一台新设备相关的最新的commit,摸清楚哪些文件发生了修改和如何修改它们。这些文件非常方便理解,我们只需要去打开查看就能理解。
一个好方法是通过示例学习,我们通过搜索mt300a这个版型文件来,找出需要修改的文件,所以你可以这样做:
grep -lri mt300a target/
显示结果是添加新板所需的最少文件列表:
target/linux/ramips/base-files/etc/board.d/01_leds
target/linux/ramips/base-files/etc/board.d/02_network
target/linux/ramips/base-files/lib/upgrade/platform.sh
target/linux/ramips/base-files/lib/ramips.sh
target/linux/ramips/dts/GL-MT300A.dts
target/linux/ramips/image/mt7620.mk
最重要的文件一般存放于以下目录:
/target/linux/<arch_name>/base-files/etc/…
该目录的文件和文件夹最终将会存放于设备固件的/etc/目录。
它一般包含下列的文件和文件夹:
/target/linux/<arch_name>/base-files/lib/…
该文件夹下的文件夹和文件对应固件中的/lib目录下文件夹和文件。
它的子文件夹和文件有:
/target/linux/<arch_name>/base-files/sbin
该文件夹对应固件中的/sbin文件夹, 一般为通用的<arch_name> sbin脚本和工具.
/target/linux/<arch_name>/dts/
设备树源文件(Device tree source files, 简写为dts).
/target/linux/<arch_name>/image/
用于构建写入用镜像的设置文件。
/target/linux/<arch_name>/<board_name>/
设备专用的设置文件
/target/linux/<arch_name>/modules.mk
menuconfig中使用的架构专用(Arch-specific)配置文件
使新设备出现在make menuconfig中
在编辑了上述的文件后, 你需要对Makefile使用touch命令
touch target/linux/*/Makefile
子目录 patches-xxx 是对一个 目标版本xxx 的内核补丁.
它包含的文件名(’3个数字-全小写字母的简介.patch’)称含义如下:
0xx – 上游需要回退的内容补丁
1xx – 等待上游合并的代码补丁
2xx – 内核构建、配置和头文件的补丁
3xx – 用于特定体系结构的补丁
4xx – MTD相关的补丁(系统和设备方面)
5xx – 文件系统相关的补丁
6xx – 网络通用补丁
7xx – 网络物理层驱动补丁
8xx – 其他设备补丁
9xx – 未分类的其他补丁
所有的补丁发布都必须具有相比现阶段潜在的优势,如:
– 补丁必须具有合适明确的主题
– 必须有一个明确清晰的commit信息来解析补丁作出了什么样的改变
– 补丁必须包含一个签署人
测试镜像固件通过ramdisk镜像而不通过烧写到Flash。
在make menuconfig配置中选择Target Images,然后再选择ramdisk选项。
这样将会编译生成一个kernel+inittramfs(内核加上内存根文件系统)的镜像文件,它的名字中将会包含initramfs。通过BootLoader的tftp功能可以将这个镜像文件导入到设备,这样可以在不需要flash文件系统的支持下进行启动。
1、小窍门
为了获取到某个你感兴趣的OpenWrt设备的端口的相关数据,需要进行shell访问。但是大多数设备都没有提供使用telnet或者ssh连接shell的方法。
某些路由器提供ping测试或NTP服务器配置,并且可能无法正确清理用户输入。尝试输入shell脚本,看看您是否幸运。您可能需要一些JavaScript知识才能禁用客户端输入验证。
$( /bin/busybox telnetd -l/bin/sh -p23 & )
如果需要远程登录,请使用HTTP获取密码哈希或使用“sed”删除/更改默认密码
$( cp /etc/shadow /www )
$( cp /etc/passwd /www )
然后尝试将他们下载到您的电脑并且破解哈希密码。
某些路由器可能会在启动之初尝试从特定的专用IP下载固件文件(例如TP-Link Archer C2 AC750),从而允许用户降级到较旧的固件。
一些路由器可能正在运行过时/不安全的HTTP服务器,并且可能容易受到缓冲区溢出或其他攻击的影响。
使用 netgear-telnetenable 许多网件设备都可以通过telnet进入,也可以查看 GitHub: insanid/NetgearTelnetEnable。如果无法使用这种方法,则可以尝试从启用了telnetd的供应商发布的源中刷新映像构建。
通过 nmrpflash许多网件设备可以被烧录,但是无法确定能够使用该工具的设备有哪些。
在WikiDevi上面许多信息可以被查询到,例如:FCC ID:十分的有用处当你搜寻文件的时候,datasheets和网络照片:能够无需打开机壳就能区分使用过的芯片。
通常可以使用以下的命令:
dmesg # log buffer might be to small, see note 1.
cat /proc/cmdline
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/devices
ls /sys/devices/platform
cat /proc/mtd
cat /sys/class/mtd/mtd*/offset # Linux 4.1 and newer, see note 2.
ifconfig -a
ls /sys/class/net
brctl show
cat /sys/kernel/debug/gpio # GPIO information
注意1:通过dmesg检索时,如果日志的缓存区太小,就会丢失掉最早的信息。如果从供应商发布的资源中构建库存及镜像文件,则可以在内核配置中设置更大的缓冲区大小。
注意2:http://lxr.free-electrons.com/source/Documentation/ABI/testing/sysfs-class-mtd
获取设置LED信息的另一个有用的工具是gpiodump,它是MT7620 GPIOMODE寄存器转储器(RAMIPS)。
由于空间有限,常见的文件传输实用程序(例如rsync/curl/ssh/scp/ftp/http/tftp)可能不可用,精简版version/applet可能在busybox中可用。
假设路由器ip为192.168.0.123,要传输的文件位于/tmp/important-data.txt
如果从/www提供Web界面
mount -o bind /tmp /www
Receiver
wget http://192.168.0.123/important-data.txt
设置一个FTP服务器,添加一个具有写权限的匿名账号。
python -m pyftpdlib -w -p 21
Sender
busybox ftpput 192.168.0.123 important-data.txt /tmp/important-data.txt
busybox nc -l -p 12345 > important-data.txt
Sender
cat /tmp/important-data.txt | busybox nc 192.168.0.123:12345
建立一个tftp服务器
busybox tftp -p -l /tmp/important-data.txt -r important-data.txt 192.168.0.123
如果上述所有工具/小工具都不可用,则可以从telnet终端进行复制,但不适用于二进制文件
1、修改设备树
vim components/firmware/uboot/arch/arm/dts/fsl-lx2160a-rdb.dts
&dpmac11 {
status = "okay";
phy-handle = <&sgmii_phy1>;
phy-connection-type = "sgmii";
};
sgmii_phy1: ethernet-phy@3 {
// RTL8211F PHY
compatible = "ethernet-phy-id001c.c916", "ethernet-phy-id004d.d072";
reg = <0x3>;
};
2、修改驱动
vim components/firmware/uboot/board/freescale/lx2160a/eth_lx2160ardb.c
/*Begin:add by zhaobaoxing for sgmii*/
srds_s2 = in_le32(&gur->rcwsr[28]) &
FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK;
srds_s2 >>= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT;
/*End:add by zhaobaoxing for sgmii*/
/*Begin:add by zhaobaoxing for sgmii*/
if (get_board_rev() == 'C') {
setup_eth_rev_c(srds_s2);
goto next;
}
/*End:add by zhaobaoxing for sgmii*/
/*Begin:add by zhaobaoxing for sgmii*/
switch (srds_s2){
case 10:
wriop_set_phy_address(WRIOP1_DPMAC11, 0,
SGMII_PHY_ADDR1);
printf("warning: zhaobaoxing for serdes2\r\n");
break;
default:
printf("SerDes2 protocol 0x%x is not supported on LX2160ARDB\n",
srds_s2);
//goto next;
break;
}
/*End:add by zhaobaoxing for sgmii*/
3、修改功能宏定义
vim components/firmware/uboot/configs/lx2160ardb_tfa_defconfig
#CONFIG_DM_ETH=y
1、修改设备树
&dpmac11 {
phy-handle = <&sgmii_phy1>;
phy-connection-type = "sgmii";
};
sgmii_phy1: ethernet-phy@3 {
// RTL8211F PHY
compatible = "ethernet-phy-id001c.c916", "ethernet-phy-id004d.d072";
reg = <0x3>;
};
1、修改rcw文件
vim components/firmware/rcw/lx2160ardb_rev2/XGGFF_PP_HHHH_RR_19_5_2/rcw_2200_750_3200_19_5_2.rcw
SRDS_PRTCL_S1=3 #10G 8 #25G 17 CPRI-10G=3
SRDS_PRTCL_S2=10 #10 #CPRI 5 #-5GC #3#-BBU #5
SRDS_PRTCL_S3=3 #2
2、修改DPC文件
vim components/firmware/mc_utils/config/lx2160a/LX2160A-RDB/dpc-usxgmii.dts
ports {
mac@3 {
/*Begin:changed by zhaobaoxing for 10G sfp+*/
/*link_type = "MAC_LINK_TYPE_PHY";
enet_if = "USXGMII";
*/
/*End:changed by zhaobaoxing for 10G sfp+*/
link_type = "MAC_LINK_TYPE_FIXED";
enet_if = "XFI";
};
mac@4 {
/*Begin:changed by zhaobaoxing for 10G sfp+*/
/*link_type = "MAC_LINK_TYPE_PHY";
enet_if = "USXGMII";
*/
/*End:changed by zhaobaoxing for 10G sfp+*/
link_type = "MAC_LINK_TYPE_FIXED";
enet_if = "XFI";
};
mac@11 {
link_type = "MAC_LINK_TYPE_PHY";
};
mac@17 {
link_type = "MAC_LINK_TYPE_PHY";
};
mac@18 {
link_type = "MAC_LINK_TYPE_PHY";
};
};
3、修改dpl文件
vim components/firmware/mc_utils/config/lx2160a/LX2160A-RDB/dpl-eth.19.dts
connections {
connection@1{
endpoint1 = "dpni@0";
endpoint2 = "dpmac@3";
};
connection@2{
endpoint1 = "dpni@1";
endpoint2 = "dpmac@4";
};
connection@3{
endpoint1 = "dpni@2";
endpoint2 = "dpmac@5";
};
connection@4{
endpoint1 = "dpni@3";
endpoint2 = "dpmac@6";
};
connection@5{
endpoint1 = "dpni@4";
endpoint2 = "dpmac@7";
};
connection@6{
endpoint1 = "dpni@5";
endpoint2 = "dpmac@8";
};
connection@7{
endpoint1 = "dpni@6";
endpoint2 = "dpmac@9";
};
connection@8{
endpoint1 = "dpni@7";
endpoint2 = "dpmac@10";
};
connection@9{
endpoint1 = "dpni@8";
endpoint2 = "dpmac@11";
};
connection@10{
endpoint1 = "dpni@9";
endpoint2 = "dpmac@12";
};
connection@11{
endpoint1 = "dpni@10";
endpoint2 = "dpmac@17";
};
connection@12{
endpoint1 = "dpni@11";
endpoint2 = "dpmac@18";
};
};
1、修改设备树
其中属性 rockchip,sgmii-mac-sel 表示使用的是哪个 gmac:
&combphy1_usq {
+ rockchip,sgmii-mac-sel = <0>; /* Use gmac0 for sgmii */
status = "okay";
};
&xpcs {
status = "okay";
};
&gmac0 {
phy-mode = "sgmii";
rockchip,pipegrf = <&pipegrf>;
rockchip,xpcs = <&xpcs>;
snps,reset-gpio = <&gpio2 RK_PC2 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
assigned-clocks = <&cru SCLK_GMAC0_RX_TX>;
assigned-clock-parents = <&gmac0_xpcsclk>;
pinctrl-names = "default";
pinctrl-0 = <&gmac0_miim>;
power-domains = <&power RK3568_PD_PIPE>;
phys = <&combphy1_usq PHY_TYPE_SGMII>;
phy-handle = <&sgmii_phy>;
status = "okay";
};
&mdio0 {
sgmii_phy: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
};
};
&gmac1 {
phy-mode = "sgmii";
rockchip,pipegrf = <&pipegrf>;
rockchip,xpcs = <&xpcs>;
snps,reset-gpio = <&gpio2 RK_PC2 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
assigned-clocks = <&cru SCLK_GMAC1_RX_TX>;
assigned-clock-parents = <&gmac1_xpcsclk>;
pinctrl-names = "default";
pinctrl-0 = <&gmac1_miim>;
power-domains = <&power RK3568_PD_PIPE>;
phys = <&combphy1_usq PHY_TYPE_SGMII>;
phy-handle = <&sgmii_phy>;
status = "okay";
};
&mdio1 {
sgmii_phy: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
};
};
2、openwrt系统
驱动补丁:
3、其它系统
无操作
1、修改设备树
&gmac1 {
phy-mode = "sgmii";
rockchip,pipegrf = <&pipegrf>;
rockchip,xpcs = <&xpcs>;
assigned-clocks = <&cru SCLK_GMAC1_RX_TX>;
assigned-clock-parents = <&gmac1_xpcsclk>;
power-domains = <&power RK3568_PD_PIPE>;
phys = <&combphy2 PHY_TYPE_SGMII>;
status = "okay";
fixed-link {
speed = <1000>;
full-duplex;
};
};
2、驱动补丁
1000baseX 走强制模式,PCS会自己link up,而SGMII 需要协商link, 这种情况一般是switch端没有固定好1000baseX模式的,之前rtl8310 switch端也是更新了很多次固件
我建议可以主控端先做一下回环,飞线要尽量短,
//driver 包产生
CONFIG_NET_PKTGEN=y
cd /proc/net/pktgen/
echo “add_device eth0” > /proc/net/pktgen/kpktgend_0
echo “pkt_size 1440” > /proc/net/pktgen/eth0
echo “count 99999999” > /proc/net/pktgen/eth0
echo “dst_mac FF:FF:FF:FF:FF:FF” > /proc/net/pktgen/eth0
echo “start” > /proc/net/pktgen/pgctrl
通过这种方式产生包,ifconfig 查看统计,确认能收到包。

Systemback是一个简单的系统备份和恢复应用程序,根据GPLv3许可条款发布。
Systemback的功能包括:
创建系统备份和用户配置文件。
将系统还原到以前的状态,就像Virtualbox的快照功能一样。
从现有安装创建可启动ISO文件。
将系统从一个分区复制到另一个分区。
升级软件。
1、只在ubuntu16.04下在安装systemback
sudo add-apt-repository ppa:nemh/systemback
sudo apt update
sudo apt install systemback
2、在 18.04/19.10/20.04安装systemback
sudo add-apt-repository "deb http://ppa.launchpad.net/nemh/systemback/ubuntu xenial main"
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 382003C2C8B7B4AB813E915B14E4942973C62A1B
sudo apt update
sudo apt install systemback
3、可以从应用程序菜单启动Systemback,需要输入密码才能使用此软件,输入密码后,单击确定按钮

1、创建自定义镜像

2、制作镜像

3、制作中
制作时间主要参考以下几个因素:

4、老版本软件中,可能不会同时生成iso,所以可能需要把sblive转换为iso。对于小于4G的sblive可以直接转换,如下:

5、对于大于4G的可以采用udf文件系统。下面就是具体的解决方法了
解压 .sblive 文件:
mkdir sblive
tar -xf /home/systemback_live_2016-04-27.sblive -C sblive
重命名 syslinux 至 isolinux:
mv sblive/syslinux/syslinux.cfg sblive/syslinux/isolinux.cfg
mv sblive/syslinux sblive/isolinux
安装 cdtools
sudo gedit https://nchc.dl.sourceforge.net/project/cdrtools/alpha/cdrtools-3.02a07.tar.gz
tar -xzvf cdrtools-3.02a07.tar.gz
cd cdrtools-3.02
make
sudo make install
生成 ISO 文件:
/opt/schily/bin/mkisofs -iso-level 3 -r -V sblive -cache-inodes -J -l -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o sblive.iso sblive
1、备份ddr_init.c platform.mk文件
2、修改ddir_init.c udimm参数,由codewarrior生成
3、在platform.mk增加CONFIG_DDR_NODIMM := 1
1、IIC3调试
修改文件:rcw_2200_750_3200_19_5_2.rcw
修改内容:IIC3_PMUX=2改为0
2、增加OLED驱动
修改文件:fsl-lx2160a-rdb.dts
修改内容:增加
&i2c2 {
clock-frequency = <400000>;
pinctrl-names = “default”;
status = “okay”;
ssd1306: oled@3c {
compatible = “solomon,ssd1306fb-i2c”;
reg = <0x3c>;
//pwms = <&pwm 4 3000>;
//reset-gpios = <&gpio2 7>;
solomon,width = <128>;
solomon,height = <64>;
solomon,page-offset = <0>;
//solomon,com-lrremap;
solomon,com-invdir;
//solomon,com-offset = <0>;
//solomon,lookup-table = /bits/ 8 <0x3f 0x3f 0x3f 0x3f>;
};
};
3、增加5386驱动
注意事项:5386寄存器存在页的概念,需要先选择页,在读写寄存器值,
手册写着寄存器16位,其中前8位是页号,后8位是寄存器地址,数据手册存在误导。
修改文件:fsl-lx2160a-rdb.dts
修改内容:增加
si5386a: sync-clk@68 {
compatible = “newu,si5386a”;
reg = <0x68>;
};
1、pic802
原理图电容型号搞错
四、以太网
1、10G光口调试
restool dpmac info dpmac.6
修改文件:dpc-usxgmii.dts
修改内容:改变
mac@3 {
/Begin:changed by zhaobaoxing for 10G sfp+/
/*link_type = “MAC_LINK_TYPE_PHY”;
enet_if = “USXGMII”;
*/
/End:changed by zhaobaoxing for 10G sfp+/
link_type = “MAC_LINK_TYPE_FIXED”;
enet_if = “XFI”;
};
2、千兆网卡调试
修改文件:fsl-lx2160a-rdb.dts
修改内容:增加
rgmii_phy1: ethernet-phy@1 {
/* AR8035 PHY */
compatible = “ethernet-phy-id001c.c916”, “ethernet-phy-id004d.d072”;
reg = <0x1>;
eee-broken-1000t;
};
修改文件:fsl-lx2160a-rdb.dts
修改内容:增加
rtc: rtc@51 {
compatible = “nxp,pcf8563”;
reg = <0x51>;
#clock-cells = <0>;
};
1、PCIE <–> M2



2、SATA <–> M 2




M.2接口有SATA和PCIE两种总线,协议分别是AHC 。NVME,非易失性内存主机控制器接口规范(Non-Volatile Memory express),是一个逻辑设备接口规范。
| M.2 | |
| SATA3.0总线 | PCIE3.0总线 |
| AHCI协议 | NVME协议 |
| 600MB/秒 | 3,200MB/秒 |
NVME协议跑在PCIE总线上,由于速率的不同,耦合电容的选取值有所不同,PCIE1.0和PCIE2.0的AC耦合电容选取值的范围在75nf-265nf(可以选用0.1uF的电容); PCIE3.0的AC耦合电容选取值的范围在176nf-265nf(可以选用0.22uF的电容);

PCIE时钟需要100nF电容耦合

走SATA的话,耦合电容需要是12nF以下

CPU端设计,需要在TX端加电容,如下图:

M.2接口端设计如下:
如果PCIE够用,M.2接口最大可以接入四对PCIE。两对也可以使用,只是 速率低一些。

下图便是LED的设计,外部M.2设备会在通讯是操作PIN10,所以板卡设计上可以设计一个LED,也可以做一个座子,可以接入LED线束。

M.2的座子,69PIN是区分设备是PCIE还是SATA设备。
NC,H 为PCIE
GND,L为SATA
如果考虑周到一些,可以在电源上再多加一些东西,如下:

使用FB隔离电源,加TVS管,保护后级电源。

#!/bin/bash
openwrt(){
echo "***************************************************"
echo "* Welcom to OpenWrt Platform *"
echo "***************************************************"
# check_deps
local source_dir="$PWD"
local service_file="/etc/init.d/rulex.service"
local executable="/usr/local/rulex"
local working_directory="/usr/local/"
local config_file="/usr/local/rulex.ini"
local db_file="/usr/local/rulex.db"
cat > "$service_file" << EOL
#!/bin/sh /etc/rc.common
START=180
USE_PROCD=1
start_service() {
procd_open_instance
procd_set_param command "$executable run -config=$config_file -db=$db_file"
procd_set_param respawn 0
procd_close_instance
}
stop_service(){
service_stop "$executable"
}
EOL
mkdir -p $working_directory
chmod +x $source_dir/rulex
cp -rfp "$source_dir/rulex" "$executable"
cp -rfp "$source_dir/rulex.ini" "$config_file"
chmod 777 $service_file
$service_file enable
$service_file start
if [ $? -eq 0 ]; then
echo "[√] Rulex service has been created and extracted."
else
echo "[x] Failed to create the Rulex service or extract files."
fi
exit 0
}
当我们编译lm-sensors模块试会发现提示错误cannot find -liconv。
通过log分析试没有把相应的libconv.a库拷贝到lm-sensors lib里。
解决方式:
cp ./build_dir/target-aarch64_generic_musl/libiconv/libiconv.a ./build_dir/target-aarch64_generic_musl/lm-sensors-3-6-0/lib/
找到contents.c文件,增加#include <sys/sysmacros.h>头文件。