uboot

使用 海思的 3531 芯片举例

在线更新 u-boot

# 设置server ip
setenv serverip 192.168.0.147
# 通过tftp载入镜像
# tftp <内存地址> <文件名>
tftp 82000000 u-boot_SK4102_hi3531_RTL8363.bin
tftp 82000000 u-boot_KMD3832_rtl8211F.bin
tftp 82000000 u-boot_KMD3864_rtl8211e.bin
# 先在ram中调试运行,OK了在重新ftp下载,写入flash
go 0x82000000

# 测试 ok 后,写入 nand,注意要重新载入一次,因为运行后有变化
tftp 82000000 u-boot_KMD4101_hi3531_1000m.bin
nand erase 0 200000
nand write 82000000 0 200000
阅读全文 »

驱动模块

insmod命令–>install module的缩写,用来载入模块,通过模块的方式在需要时载入内核,可使内核精简,高效。此类载入的模块,通常为设备驱动程序.

模块代码有两种运行方式,一是静态编译连接进内核,在系统启动过程中进行初始化;一是编译成可动态加载的module,通过insmod动态加载重定位到内核。这两种方式可以在Makefile中通过obj-y或obj-m选项进行选择。

20211208_122853.png
// 加载驱动模块
insmod rtl8363
// 列出已加载的模块
lsmod
// 移除已加载模块
rmmod rtl8363

海思平台编译 Openssl

// 输入下面字符然后 tab 键补全,确认交叉编译环境是否正常
arm-

./config no-asm no-async shared --prefix=/bakpart/openssl/ --cross-compile-prefix=arm-hisiv100nptl-linux-

no-asm 在交叉编译过程中不使用汇编代码代码加速编译过程
no-async 没有提供GNU C的ucontext库,避免如下报错:
./libcrypto.so: warning: gethostbyname is obsolescent, use getnameinfo() instead.
./libcrypto.so: undefined reference to `getcontext'
./libcrypto.so: undefined reference to `setcontext'
./libcrypto.so: undefined reference to `makecontext'
no-shared 生成静态链接库
--prefix 指定生成lib include bin目录的路径,不修改此项则默认为OPENSSLDIR目录

make

如果编译报错,并提示"m64"字样报错信息,多半是交叉编译器不支持m64选项。解决办法:
修改Makefile ,若有-m32或-m64 字段,直接删除即可

make install

完成安装后,你可以在/bakpart/openssl/发现include和lib。
其中include包含头文件集合,lib是生成的静态库(.a.1.1)和动态库文件(.so.1.1)。
阅读全文 »

Ethernet网口通常由CPU、MAC和PHY三部分组成,通常用DMA控制器参与网口数据传输,以减轻CPU的负担。有的CPU内部集成MAC控制器,有的则采用外置的MAC芯片。

MII(Media Independent Interface 媒体独立接口)是IEEE 802.3标准定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口。MII数据接口包括分别用于发送器和接收器的两条独立信道,每条信道拥有数据、时钟和控制信号,共16条信号线。MII管理接口即MDIO接口包含一个时钟信号(MDC)和一个数据信号(MDIO),通过管理接口,上层能监视和控制PHY。根据IEEE802.3标准定义,MII管理接口最多支持同时管理32个PHY。

CPU/MAC通过MDIO接口(类似于I2C接口,因此PHY拥有PHY ADDR)管理PHY芯片。

MAC和PHY之间的数据传输接口类型有MII/RMII(Reduced MII)/SMII(Stream MII)/GMII几种,根据传输速率(10M/100M/1000M)又有不同细分,比如千兆GMII/RGMII/SGMII。

GMII是千兆网的MII接口,这个也有相应的RGMII接口,表示简化了的GMII接口。

20211208_134157.png
阅读全文 »

// 只查看指定 mac 地址的包
eth.src == 00:00:38:64:82:11

问题

npcap vs winpcap

winpcap 已经停止更新了,现在使用 npcap

win7安装wireshark后显示“Can‘t get list of interfaces: PacketGetAdapterNames: 系统找不到指定的路径“

卸载旧的 npcap 1.55 版本,到下面地址下载 1.60 版本,安装就可以了
https://npcap.com/#download

打印变量

ROOTDIR=$(shell pwd)

$(info "test ====")
$(warning rootdir is $(ROOTDIR))

# 这个可以停止当前makefile的编译
$(error "error: this will stop the compile")

增加 .h .c 文件

增加目标文件,会自动编译

COBJS-$(CONFIG_GODNET) += sys_godnet.o
COBJS-$(CONFIG_GODNET) += rtl8363.o rtk_switch.o port.o rtl8367c_asicdrv.o rtl8367c_asicdrv_port.o rtl8367c_asicdrv_phy.o

include、-include、sinclude使用

在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。如果文件都没有指定绝对路径或是相对路径的话,make 会在当前目录下首先寻找,如果当前目录下没有找到,那么,make 还会在下面的几个目录下找:
● 如果 make 执行时,有“-I”或“–include-dir”参数,那么 make 就会在这个参数 所指定的目录下去寻找。
● 如果目录/include(一般是:/usr/local/bin 或/usr/include)存在的话,make 也会去找。如果有文件没有找到的话,make 会生成一条警告信息,但不会马上出现致命错误。它会继续载入其它的文件,一旦完成 makefile 的读取,make 会再重试这些没有找到,或是不能读取的文件,如果还是不行,make 才会出现一条致命信息。
如果你想让 make不理那些无法读取的文件,而继续执行,你可以在 include 前加一个减号“-”。

-include <filename>

其表示,无论 include 过程中出现什么错误,都不要报错继续执行。和其它版本 make 兼容的相关命令是 include,其作用和这一个是一样的。

include 的语法是:
include filename 可以是当前操作系统 Shell 的文件模式 (可以保含路径和通配符) 在 include前面可以有一些空字符,但是绝不能是[Tab]键开始。
多个 filename 可以用一个或多个空格隔开

举个例子,你有这样几个 Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了 e.mk 和f.mk

include foo.make *.mk $(bar)  

等价于:

include foo.make a.mk b.mk c.mk e.mk f.mk

library include

-L :此选项是指定链接库的文件夹地址
-l(小写的L):-lssl 即是寻找/usr/local/openssl/lib目录下的 libssl.a 这个库,编译器会自动寻找 libssl.a或者libssl.so
-I(大写的i):指定头文件的文件夹地址

MVVM
MVVM: Model-View-ViewModel,数据驱动视图

使用 vscode 开发
npm(node package manager):nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)
安装nodejs

注释

// 行注释
# 注释信息
// 块注释
#!/bin/bash
echo "Adding new users to LDAP Server..."
<<COMMENT1
Master LDAP server : dir1.nixcraft.net.in
Add user to master and it will get sync to backup server too
Profile and active directory hooks are below
COMMENT1
echo "Searching for user..."

赋值给变量

var=$(command)

if 判断

# 这里的-f参数判断 /data/filename 是否存在
if [ ! -f "/data/filename" ]; then
echo "文件不存在"
else
rm -f /data/filename
fi

# 字符串相等
if [ "$ver"x = "20x1018191"x ]; then
echo "Version=20x101819"
else
echo "Version!=20x101819"
fi

比较两个字符串是否相等的办法是:
if [ "$test"x = "test" ]; then
这里的关键有几点:
1 使用单个等号
2 注意到等号两边各有一个空格:这是unix shell的要求
3 注意到"$test"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。
而如果没有这个x,表达式就会报错:[: =: unary operator expected


# 逻辑或
if [ "$ver" = "20x1018191" ] || [ "$ver" = "11x061121" ]; then
echo "Version=20x101819"
else
echo "Version!=20x101819"
fi

调用命令

data=$(command)

遍历字符串

commonApp="64sqlserver|64ctrl|boa_1203_arm"

for var in $(echo ${commonApp} | awk '{split($0,arr,"|");for(i in arr) print arr[i]}')
do
echo "${var}"
done

函数

注意:所有函数在使用前必须定义。调用函数仅使用其函数名即可。

#!/bin/bash

demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
UNIX Shell 里面比较字符写法:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串

tcpclient

waitForConnected() 等待链接的建立
waitForReadyRead() 等待新数据的到来
waitForBytesWritten() 等待数据写入socket
waitForDisconnected() 等待链接断开

qtcpsocket 不能跨线程使用

阅读全文 »

启动的时候 按任意键 进入u-boot 交互模式
查看系统环境变量
printenv

环境变量

# serverip=192.168.0.107
setenv serverip 192.168.0.147
saveenv

在线更新 u-boot

# 设置server ip
setenv serverip 192.168.0.147
# 通过tftp载入镜像
# tftp <内存地址> <文件名>
tftp 82000000 u-boot_SK4102_hi3531_RTL8363.bin
tftp 82000000 u-boot_KMD4101_hi3531_1000m.bin
# 先在ram中调试运行,OK了在重新ftp下载,写入flash
go 0x82000000

# 测试 ok 后,写入 nand,注意要重新载入一次,因为运行后有变化
tftp 82000000 u-boot_KMD4101_hi3531_1000m.bin
nand erase 0 200000
nand write 82000000 0 200000

添加文件

以RTL8363 ASIC驱动为例
头文件添加到 \include\rtl8363\
源文件添加到 \drivers\net\stmmac\
编辑 \drivers\net\stmmac\Makefile 添加下面驱动目标文件

COBJS-$(CONFIG_GODNET) += rtl8363.o rtk_switch.o port.o rtl8367c_asicdrv.o \
rtl8367c_asicdrv_port.o rtl8367c_asicdrv_phy.o \
rtl8367c_asicdrv_green.o smi_8363.o rtl8367c_asicdrv_misc.o \
rtl8367c_asicdrv_mirror.o rtl8367c_asicdrv_portIsolation.o \
rtl8367c_asicdrv_inbwctrl.o rtl8367c_asicdrv_rma.o rtl8367c_asicdrv_scheduling.o \
rtl8367c_asicdrv_lut.o rtl8367c_asicdrv_eee.o

更新文件系统

// 31aeec0 是文件系统的大小,tftp 会打出来
tftp 82000000 KMD3864_rootfs_main.yaffs2
nand erase 700000
nand write.yaffs 82000000 700000 31aeec0