ARCH=sparc CC=parc-gaisler-linux4.9-gcc CXX=parc-gaisler-linux4.9-g++ cmake .. -DCMAKE_C_COMPILER=sparc-gaisler-linux4.9-gcc -DCMAKE_CXX_COMPILER=sparc-gaisler-linux4.9-g++
ARCH=sparc CC=sparc-gaisler-linux4.9-gcc CXX=sparc-gaisler-linux4.9-g++ cmake .. -DCMAKE_C_COMPILER=sparc-gaisler-linux4.9-gcc -DCMAKE_CXX_COMPILER=sparc-gaisler-linux4.9-g++ -DCMAKE_CXX_FLAGS=-latomic -DCMAKE_C_FLAGS=-latomic
qemu-system-sparc -M leon3_generic -kernel image.ram -nographic -m 512
rootfs.cpio大小53M,需要压缩,可以选择直接使用tar指令,也可以在buildroot配置压缩
# make menuconfig进入配置界面,输入"/",开始搜索,输入cpio,找到BR2_TARGET_ROOTFS_CPIO
进入compression method,选择gzip
保存,退出,开始编译
# make -j4进入输入目录
# cd output/images查看文件rootfs.cpio.gz大小,17M
完成!
linux容器(linux containers):一种操作系统层虚拟化技术,为linux内核容器功能的一个用户空间接口;
LXC关键技术点:
- chroot,根切换,从容器角度来看,仿佛真的有自己的根树;
- namespaces:名称空间,负责将资源隔离,比如pid,网络,mnt,user,uts等;
- CGroups:控制组,负责控制资源的分配;
常用命令:
# lxc-checkconfig检查系统环境是否满足容器需求;
# lxc-create -n name -t template_name [-- template-options]创建lxc容器
# lxc-start -n name -d启动容器
# lxc-info -n name查看容器相关信息
# lxc-stop停止容器
# lxc-destory删除停止状态的容器
# lxc-snapshot创建和恢复快照
<Ctrl+a q>退出容器
在buildroot里配置,make menuconfig,按"/"搜索lxc,选中BR2_PACKAGE_LXC,选中lxc,保存退出,开始编译
编译完成进入虚拟sparc,使用指令
# lxc-checkconfig报错
这里判断是没有libvirt,查找libvirt需求
查找BR2_PACKAGE_LIBVIRT
BR2_PACKAGE_LIBVIRT_ARCH_SUPPORTS未支持sparc,修改package/libvirt/Config.in文件,添加sparc支持
BR2_PACKAGE_HAS_UDEV为no !!!
询问发现,不需要libvirt,选上内核包会很大!
选中上图内容即可
查找,无以上内容
使用make linux-menuconfig而不是make menuconfig
"/"搜索NAMESPACE,选中Namespaces support,回车进入
全部勾选,保存退出,重新编译
再次执行命令检查
# lxc-checkconfig结果:
namespace完成
开始解决control group问题
参考https://blog.csdn.net/hylaking/article/details/90604020
结果:
CGROUP_PERF
func tracer ???
算了先不管
主要问题CGROUP_PERL
找了半天没有找到问题,最后
偶然发现perf_events需要sparc64,默认是sparc所以无法选中,选中之后去查看perf_events
depends on变成y了,输入1进去选中
现在去看看CGROUP_PERF
depends on变成y了,输入1进去选中
出现选项了,选中,保存退出,开始编译
出错了
编译错误,这要如何解决???
需要32bit系统,所有不能选中perf
跳过lxc-checkconfig报错直接创建
# lxc-create -n test -t /usr/share/lxc/templates/lxc-xxx- 第一个lxc-busybox
失败
- 第二个lxc-download
没有网络配置,失败,配上网络应该可行
打开网址看看
- 第三个lxc-local
失败,找到rootfs
只有一个README文件???
打开看看
翻译:他的目录必须存在,即使它可能是空的。它用于将lxc的rootfs临时挂载到私有挂载命名空间中,该命名空间仅由容器中运行的进程可见。
- 第四个lxc-oci
失败
接下来目标,先不管文件大小,下载一个模板试试看是否能行
未找到下载文件
尝试直接ubuntu虚拟机上安装一个lxc,构建一个template,拷贝到sparc里
失败,但是原因有所变化,可能原因
编译的时候就报错,这里出了错
git下来一个lxc-templates,将编译的模板拷贝到sparc
和前面模板一样的问题
资料从百度云下载,下载了整整一晚上。。。
打开之后查看,发现,看不懂。。。
算了,还是中秋节过了去问一下吧,不管了。
需求先理解一下,把内核代码先编译一下
30服务器上编译
将10s的z7的JARI系统内核编译出来,编译需要用到交叉编译
需要先安装mkimage
sudo apt-get install u-boot-tools -y
配置内核
make ARCH=arm CROSS_COMPILE=/home/yuanjilin/tools/compile_z7/bin/arm-linux-gnueabihf- menuconfig
编译
make ARCH=arm CROSS_COMPILE=/home/yuanjilin/tools/compile_z7/bin/arm-linux-gnueabihf- uImage LOADADDR=0x2380000 -j32
编译完成之后,内核文件在arch/arm/boot目录
编译文件系统
配置
make ARCH=arm CROSS_COMPILE=/home/yuanjilin/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- menuconfig
编译
make ARCH=arm CROSS_COMPILE=/home/yuanjilin/tools/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -j32
编译完成之后,文件系统在output/images目录
验证驱动需求,包括emmc、网口驱动、总线协议(spi、axi)、hp
之后适配射频驱动
拿到板子了,连接电源和串口线进行测试
发现没有com端口
需要FT2232HL驱动,驱动文件在我电脑D:\驱动\CDM-v2.12.36.4.U-WHQL-Certified目录
完成,com口出现,有两个端口,com3和com4,测试com4可用
进入系统
账户:root
密码:无
插入TF卡,准备挂载下载系统包
TF卡出错,更换tf卡还是出错,与客户交流,客户也没使用过TF卡,应该是板子的问题
客户提供信息
源程序boot似乎是在flash中,linux镜像在emmc中
需要使用uboot联网验证测试,是否满足删除原本系统安装JARI系统条件
启动板卡,进入账户,输入reboot重启,根据提示进入uboot
使用网线连接板子和电脑
查看电脑与板子连接的网络,设置ip地址
设置板子ip,同网段,但是不能一样
setenv ipaddr 192.168.1.9
ping电脑ip,验证
ping 192.168.1.10
显示host is alive就表示配置完成
现在使用tftp传文件系统
板子上设置主机ip
setenv serverip 192.168.1.10
主机打开tftp软件,并且将要传输的文件放在该目录下
打开软件
板子输入指令
查看系统启动项
printenv
查找kernel_addr地址
查找文件系统地址
传输内核
tftpboot 1D000000 uImage
将文件uImage传输到地址0x1D000000
传输文件系统
tftpboot 02100000 rootfs.cpio.uboot
将rootfs.cpio.uboot传输到0x02100000
整合一下
setenv ipaddr 192.168.1.9 && setenv serverip 192.168.1.10
tftpboot 1D000000 uImage && tftpboot 02100000 JARI-Z7-ramdisk && tftpboot 1cf00040 JARI-Z7-dtb
增加启动参数
setenv bootargs "clk_ignore_unused cpuidle.off=1 earlycon=cdns,mmio,0xFF000000,115200n8 console=ttyPS0,115200 uio_pdrv_genirq.of_id=generic-uio loglevel=8 initcall_debug=1"
启动
bootm 1d000000 2100000 1cf00040
失败
对比一下,客户系统启动
自己的系统
查看启动流程
从bootcmd开始追查流程
启动指令
run xilinxcmd && sf probe 0 0 0 && sf read $kernel_zip_addr $kernel_qspi_offset $kernel_size && unzip $kernel_unzip_addr $kernel_addr && sf read $initrd_addr $initrd_qspi_offset $initrd_size && sf read $dts_addr $dts_qspi_offset $dts_size && booti $kernel_addr $initrd_addr $dts_load_addr
内存里没有内核数据和文件系统数据,需要从flash里进行拉取,使用sf
使用客户内核,我们的文件系统,客户的设备树进行调试
解压客户内核
sf probe 0 0 0 && sf read $kernel_zip_addr $kernel_qspi_offset $kernel_size && unzip $kernel_unzip_addr $kernel_addr
读客户设备树
sf read $dts_addr $dts_qspi_offset $dts_size
拷贝我们自己的文件系统
tftpboot 02100000 JARI-Z7-ramdisk
读(错误原因)
sf read 2100000 $initrd_qspi_offset 98b2ee
启动
booti $kernel_addr 2100000 $dts_load_addr
完成
应该是我们的内核配置问题
查看文件系统配置文件
zcat /proc/config.gz
使用该配置文件进行编译内核
自动配置网络
udhcpc -i eth0
使用ssh传输配置文件到30
将客户提供的内核和设备树编译,内核配置文件替换为我们自己的配置文件
根据上述下载步骤重新下载编译
配置tftp
setenv ipaddr 192.168.1.9 && setenv serverip 192.168.1.10
下载内核
tftpboot 1d000000 Image
下载文件系统
tftpboot 2100000 JARI-Z7-ramdisk
下载设备树
tftpboot 1cf00040 mpsoc.dtb
整合
tftpboot 1d000000 Image && tftpboot 2100000 JARI-Z7-ramdisk && tftpboot 1cf00040 mpsoc.dtb
启动
booti 1d000000 2100000 1cf00040
启动完成
直接使用该配置编译JARI内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j64
配置tftp
setenv ipaddr 192.168.1.9 && setenv serverip 192.168.1.10
下载内容
tftpboot 1d000000 Image && tftpboot 2100000 JARI-Z7-ramdisk && tftpboot 1cf00040 mpsoc.dtb
启动
booti 1d000000 2100000 1cf00040
启动失败,卡死
内核有问题
现在有
JARI 4.19.90(我们自己的)
SDK 4.19.0(客户提供)
Linux 4.19.0(官方标准文件https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/)
Linux 4.19.90(官方标准文件)
需要将客户对于标准linux对应版本的修改应用到我们自己的JARI系统上
将SDK 4.19.0和Linux 4.19.0进行对比,生成patch,然后对JARI 4.19.90打入补丁,会有冲突文件XXX.rej,这时候需要手动查看xxx.rej文件进行修改
将SDK 4.19.0源文件清理一下
make distclean
复制SDK 4.19.0源码到Linux 4.19.0文件
cp /home/yuanjilin/10S-Z7/adrv9026_kernel/Source/linux-xlnx-xlnx_rebase_v4.19_2019.2/* . -rfpd
添加到缓存区
git add . -A
查看
git status .
添加到仓库并且命名
git commit -m "merge xilinx code"
制作补丁
git format-patch -1
将Linux 4.19.0与Linux 4.19.90对比,生成patch,对SDK 4.19.0打入补丁进行升级,成为JARI 4.19.90,会有冲突文件XXX.rej,这时候需要手动查看xxx.rej文件进行修改
复制Linux 4.19.90源码到Linux 4.19.0文件
cp ../linux-4.19.90/* . -rfpd
添加到缓存区
git add . -A
查看
git status .
添加到仓库并且命名
git commit -m "linux 4.19.0 to 4.19.90"
制作补丁
git format-patch -1
git commit -m "init repo as linux 4.19.90 main stream"
dd指令测试写速度
dd if=/dev/zero of=test bs=4M count=100
dd指令测试读速度
dd if=test of=/dev/null
iperf是client向server段发送数据
client显示发送速率,server显示接收速率
配置板子网络
ifconfig eth0 up
udhcpc -i eth0
板子作为client
iperf -c 192.168.1.85 -P 6 -t 60
50作为server
iperf -s
板子作为server
iperf -s
50作为client
iperf -c 192.168.4.160 -P 6 -t 60
网口eth0 网口有问题
网口eth1 发送速率94.2Mbits/s
接收速率94.2Mbits/s
网口enp2s0f0 网口有问题
网口enp2s0f1 发送速率94.3Mbits/s
接收速率94.2Mbits/s
使用串口调试工具
板子命令行控制串口输出,调试工具查看
echo 123456 > /dev/ttyAMA3
配置板卡can0波特率为1Mcd /bo
ifconfig can0 down;ip link set can0 type can bitrate 1000000;ip link set can0 up
连接can分析仪和软件
板卡发送数据
cansend can0 123#DEADBEEF
板卡接收数据
candump can0
devmem查看寄存器的值
控制LED11亮灭
LED11属于GPIO1,所以基准地址为0x28005000
0x10寄存器控制B组端口方向模式,00000000分别对应B0-B7,此时所有B口都为输入状态
0x0c寄存器控制B组端口输出状态,00000000分别对应B0-B7,此时所有B口都为低电平
如上图,LED默认拉高,所以高电平LED灭,低电平LED亮
所以此时需要设置
0x10为00000010(0x02),加上基准地址,设置0x28005010寄存器为0x02
0x0c为00000010(0x02),加上机制地址,设置0x2800500c寄存器为0x02
设置GPIO1_B1为输出
devmem 0x28005010 w 0x02
设置GPIO1_B1为低电平,LED11亮
devmem 0x2800500c w 0x00
设置GPIO1_B1为高电平,LED11灭
devmem 0x2800500c w 0x02
因为没有设置其他口为输出,模式,所以即使为低电平,也未生效
进入/sys/class/gpio目录可以看到
飞腾设定2个GPIO口,分别是gpio0和gpio1
每组gpio口包含16个GPIO,分别对应A0-7,B0-7
使用480和496就是这两个gpio的起始位号
这里查找的是LED11,就是GPIO1_B1
假定496为gpio1的起始位号,GPIO1_B1位号为496+8+2=506
echo 506 > /sys/class/gpio/exprt
查看目录
进入GPIO506目录,查看direction状态
cat direction
in表示输入状态,修改为输出状态
echo out > direction
查看direction状态
现在查看value的值
此时LED11灯应该亮起,但是板子上灯是熄灭状态
所以gpio1的起始位号是480,GPIO1_B1位号为480+8+2=490
echo 490 > /sys/class/gpio/exprt
进入GPIO506目录,查看direction状态
cat direction
in表示输入状态,修改为输出状态
echo out > direction
查看direction状态
现在查看value的值
此时LED11灯应该亮起,板子上灯是也是亮起状态,应该是将direction设置为out之后就亮起了
现在改变value值
echo 1 > value
现在板子上LED11熄灭
完成
下载安装包https://pyropus.ca./software/memtester/
解压
tar xf memtester-4.5.1.tar.gz
进入文件,准备交叉编译
修改文件conf-cc和conf-ld
将cc修改为交叉编译工具链
修改Makefile安装路径,方便打包
将20行INSTALLPATH修改为用户路径
编译安装
make && make install
将安装目录打包发送到板子上
测试
./memtester 256 1
测试256MB内存,测试1次
完成!
git下载ltp源码
git clone https://gitlab.jrlc.link:442/jrlcgroup/testcases/ltp.git
进入ltp文件
make autotools
配置安装目录和交叉编译工具链
./configure --prefix=/home/jrlc/install CC=/home/jrlc/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --host=aarch64-linux
编译安装
make && make install
ltp测试不跑失败测试,只跑通过测试
崩溃
使用最小测试集
根据客户需求,添加rtc-i2c驱动,ds1307驱动,将客户代码与/home/yuanjilin/JARL/linux-kprl/drivers/rtc目录的rtc-ds1307.c文件替换
配置内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j64 menuconfig
搜索ds1307
选中RTC_DRV_DS1307
保存退出,开始编译
报错
grep -inr rtc_add_group drivers/
将rtc-core.h头文件包含到rtc-ds1307.c中,重新编译
编译完成!
rtc时间设置
先设置系统时间
date 092910002022.00
设置时间,月/日/时/分/年.秒
或者
date 202009291000.0
年/月/日/时/分.秒
同步系统时间到硬件
hwclock -w
查看硬件时间
hwclock -r
硬件时间就变成2022.09.29 10:10:00
rtc-i2c系统掉电之后时间复位
修改目录/etc/init.d下的文件S50telnet文件,添加命令
ifconfig eth0 up
ifconfig eth1 up
ifconfig enp2s0f1 up
ifconfig enp2s0f0 up
目录
/home/yuanjilin/JARL/linux-kprl
配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j64 menuconfig
搜索
CONFIG_ARM_SBSA_WATCHDOG
CONFIG_ACPI_GTDT
确保全部选中,编译即可
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j64
启动系统
echo 1 > /dev/watchdog
过一会系统重启,看门狗驱动完成
目录
/home/yuanjilin/JARI/linux-kprl
配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j64 menuconfig
搜索
GENERIC_ADC_THERMAL
选中状态
编译
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j64
启动系统,查看
ls /sys/class/thermal/
无内容,待完善
修改文件
/home/wangx/kw/kprl/output/ZX/T3/CQA3T_BV3_DK/build/minicom-19ab49422f3431102c31fea01549121385113f80/src/minicom.c
第1019行函数修改
直接再函数调用时return,不执行任何操作,测试函数,不会影响程序运行
将ltp-testsuite.tar发送到板子
解压
tar xf ltp-testsuite.tar
进入ltp-testsuite
cd ltp-testsuite-install
运行
./runltp -p -f test -l ltp_kernel.log -o ltp.output
测试结果再results目录下的ltp_kernel.log文件
将memtester-testcase.tar发送到板子
解压
tar xf memtester-testcase.tar
进入ltp-testsuite
cd memtester-testsuite-install/bin
运行
./memtester 256 1
测试256MB,测试一次
内核目录删除除了scripts之外所有的.c文件
mv scripts ../
rm `find -name "*.c"`
mv ../scripts .
问题描述:将网口down之后再up,网口link不上
将yt8521驱动添加
源码地址30服务器
/home/yuanjilin/JARI/buildmod/yt-phy-driver/linux
将drivers和include文件拷贝到内核源码
修改配置
vim /home/yuanjilin/JARI/linux-kprl/drivers/net/phy/Kconfig
在438行添加内容
config MOTORCOMM_PHY
tristate "Motorcomm PHYs"
---help---
Supports the YT8010, YT8510, YT8511, YT8512 PHYs.
修改编译项
vim /home/yuanjilin/JARI/linux-kprl/drivers/net/phy/Makefile
在最后添加内容
obj-$(CONFIG_MOTORCOMM_PHY) += motorcomm.o
配置内核
make ARCH=arm64 CROSS_COMPILE=~/tools/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -j32 menuconfig
进入Device Drivers --->Network device support --->PHY Device support and infrastructure --->
选中Motorcomm PHYs
保存退出
编译
make ARCH=arm64 CROSS_COMPILE=~/tools/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -j32
完成
网口配通之后down再up之后,需要等待一段时间才能自动配置路由
点开软件,点击最上面的文件,打开查找iso文件
点击启动,选中写入硬盘映像
写入方式选择为RAW
点击下面按键格式化,格式化硬盘
点击写入,等待写入完成
完成
can目录
/home/wangx/kw/kprl/output/phytium/ft2000a/JARI-WORKS/build/linux-7e4ed49d/drivers/net/can
Image目录
/home/wangx/kw/kprl/output/phytium/ft2000a/JARI-WORKS/images
can测试代码交叉编译
make CC=aarch64-linux-gnu-gcc
./can_demo_app -d can0 -s 300 -b 55
查看中断
cat /proc/interrupts
删除boot界面JARI
efibootmgr -b 000x -B
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j64 menuconfig
kernel目录
/home/yuanjilin/JARI/linux-kprl/arch/arm64/boot/Image.gz
文件系统目录
/home/wangx/kw/kprl/bsp/phytium/ft2000a/JARI-WORKS/rootfs_overlay
/home/yuanjilin/JARI/linux-kprl/drivers/hwmon/
ina2xx.ko
lm90.ko
raspberrypi-hwmon.ko
nvme0n1p1
0x0000011a 0x00000128
验证spi
添加链表
构建空指针
取成员member的类型
typeof(((type *)0) -> member)
取成员member的地址
&(((type *)0) -> member)
获取结构体某个成员对于该元素的偏移量
offsetof(type, member-designator)
获取member成员对于type首地址的偏移
数组或者指针复制
memcpy(str1, str2, len)
str1指向需要被赋值数组的指针,str2指向需要被复制的数据源指针,len要被复制的字节数
快速初始化
memset(str, n, len)
str指向要填充的内存块,n要被设置的值,len字节数
异或
^
解析命令行选项参数
字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
char *strstr(const char *haystack, const char *needle)
把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
int atoi(const char *str)
双d2000
tftpboot 0x90000000 fip-all-one-20230116.bin;flashe 0 0x0 0x400000;flashw 0 0x90000000 0x0 0x400000单d2000
tftpboot 0x90000000 control-fip-all-20230421.bin;flashe 0 0x0 0x400000;flashw 0 0x90000000 0x0 0x400000
验证
md.b 0 0x300
双d2000
tftpboot 0x90000000 d2000-devboard-dsk.dtb;tftpboot 0x90100000 uImage.gz;tftpboot 0x92100000 ramdiskfs.gz;bootm 0x90100000 0x92100000 0x90000000单d2000
tftpboot 0x90000000 d2000_one-devboard-dsk.dtb;tftpboot 0x90100000 uImage.gz;tftpboot 0x92100000 ramdiskfs.gz;bootm 0x90100000 0x92100000 0x90000000单d2000v
tftpboot 0x90000000 d2000v-one-devboard-dsk.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz;bootm 0x90100000 0x92100000 0x90000000d2000v boot
tftpboot 0x90000000 fip-all.bin;flashe 0 0x0 0x400000;flashw 0 0x90000000 0x0 0x400000
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 solcpus=2-7 root=/dev/ram0 rw rootwait rootfs_index isafety=1 User_Board'
tftpboot 0x90000000 d2000v-devboard-dsk.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz;mw.l 0x28014004 0x300000e;gpio_wdt enable;bootm 0x90100000 0x92100000 0x90000000
tftpboot 0x90000000 d2000v-one-devboard-dsk.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz;mw.l 0x28014004 0x300000e;gpio_wdt enable;bootm 0x90100000 0x92100000 0x90000000
tftpboot 0x90000000 fip-all.bin
flashe 0 0 0x400000
flashw 0 0x90000000 0 0x400000
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 solcpus=2-7 root=/dev/ram0 rw rootwait rootfs_index isafety=1 User_Board'
tftpboot 0x90000000 d2000-devboard-dsk.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz;mw.l 0x28014004 0x300000e;gpio_wdt enable;bootm 0x90100000 0x92100000 0x90000000
./ubifs_create.sh 193MiB
修改编译框架,一次性编译多个动态库和测试程序
建立虚拟网卡
sudo ip tuntap add mode tap dev test
sudo ifconfig test 16.1.3.100 netmask 255.255.255.0 up删除虚拟网卡
ip link delete test
改网卡mac地址
ifconfig eth0 down
ifconfig eth0 192.168.1.139
ifconfig eth0 hw ether 3C:6A:2C:3C:6A:39
ifconfig eth0 up查询全部静态arp
arp -a检查网口idx
netsh i i show in添加静态arp
netsh -c "i i" add neighbors idx IP MAX
git remote set-url origin xxx
#!/bin/bash
output=$(lspci)
if echo "$output" | grep -q "Xilinx" && echo "$output" | grep -q "04:00.0";then
if echo "$output" | grep -q "01:00.0";then
echo "find 01:00.0"
break
else
echo "find 04:00.0 but no 01:00.0"
break
fi
else
echo "not Xilinx"
break
fiarg=$1
if [-z "$arg"];then
echo "null"
else
echo "$arg"
firoute add -net 17.5.3.0/24 dev vnet10route del -net 0.0.0.0/0 dev vnet10
ip route add 16.1.3.0/24 via 1
添加默认网关
route add default gw 192.168.4.1export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export PATH=$PATH:/home/wangx/kw/kprl/output/phytium/FT-D2000/FT-DK/host/opt/gcc-7.3.1-64-gnu/bin
source ~/.bashrc编写程序:
在框架中的examples目录中编写程序,并且编写meson.build文件
配置环境:
在dpdk目录下,配置arm64环境
meson setup aarch64-linux-gnu-gcc --cross-file config/arm/arm64_armv8_linux_gcc 配置x86环境
meson setup x86-linux-gun-gcc配置编译选项:
进入配置环境构建的目录
meson configure -Dexamples=xxxxxx为example目录下的文件目录
编译:
ninja挂载巨页内存
echo 1 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages接口rev ff之后,继续写
输入指令
echo 1 > /sys/bus/pci/devices/0000:02:00.0/remove设备删除完成
echo 1 > /sys/bus/pci/rescan
重新扫描失败
rmmod xdma
echo 1 > /sys/bus/pci/devices/0000:02:00.0/reset
D3表示低功耗模式
CPU1 GPIO3_13 -> F1 CPU1 GPIO3_14 -> F3 CPU2 GPIO3_2 -> F3
/gp1_dir/configs/usr/
CFLAGS = -lm -g -Wall -lpthread -irt
socket绑定网卡
char* interface_name = "vnet2"; // 替换为你的网络接口名
struct ifreq ifr;
strncpy(ifr.ifr_name, interface_name, IFNAMSIZ);
ioctl(sockfd, SIOCGIFINDEX, &ifr);
问题汇总:
1、单d2000v板卡和交换之间的pcie通信偶然出现不通的现象。
2、双d2000v的CPU2和fpga2、fpga3的通信出现了,fpga2断连,fpga3无法通信问题。
3、重启高层应用之后发现帧交换掉了的问题。
不改程序规避方法:
1、交换和单d2000v同时重启。
地面复现:
改程序的解决方法:
cpu、pcie
fpga、寄存器(fpga3)
info状态信息帧添加cpu号;添加通过gpio判断fpga状态;修改判断pcie状态逻辑
修改printf为log_info
修改优先级bug
添加rescan标志;添加线程去重新扫描;添加gpio口检测,拉低或者由低变高都会重新扫描;添加控制cpu重新扫描
启动脚本修改顺序,先执行帧交换,再执行遥控遥测
按照组网星遥测需求进行修改
同步组网星修改需求
帧交换添加管道初始化和非阻塞读取,修改接受帧时查找ip时没找到网口时的处理逻辑
与硬件组fpga工程师确认fpga程序,目前飞腾提供的fpga程序可以实现回环功能
fpga使用的flash与原理图上不一致,实际上使用的是美光的MT25QU01GBBB8ESF-0SIT芯片,公司的sp20固化,需要fpga工程师配合使用jtag固化
还需要压缩bin文件
- 默认使用的bin/msc文件大小为25MB,spi为1
- 修改之后的bin/msc文件大小为5MB,spi为4
固化之后启动板卡,上电之后fpga从flash读取数据需要一定的时间,如果使用的是默认的固化文件,需要等待一段时间启动
使用的内核,文件系统,设备树如下
- 内核:
- 文件系统:
- 设备树:
使用的程序如下:
-
环境搭建脚本程序:dpdk-pdevbind.sh
-
测试环境程序:dpdk-helloworld
-
帧交换测试程序:dpdk-frame
启动板卡
mw 0x281a01d0 0x31;
mw 0x281a01d4 0x31;
mw 0x281a01d8 0x31;
mw 0x281a01dc 0x31;
mw 0x281a01e0 0x31;
mw 0x281a01e4 0x31;
mw 0x281a11d0 0x1100;
mw 0x281a1198 0x1100;
ext4load nvme 0:1 0x90100000 /boot/uImage_1206
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 isolcpus=2-7 rw';
ext4load nvme 0:1 0x91a00000 /boot/ramdiskfs_1206.gz;
ext4load nvme 0:1 0x90000000 /boot/d2000v-devboard-dsk-rgmii.dtb
bootm 0x90100000 0x91a00000 0x90000000
ext4load nvme 0:1 0x90100000 /boot/uImage-dpdk-nosafe
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 rw';
ext4load nvme 0:1 0x91a00000 /boot/ramdiskfs.gz;
ext4load nvme 0:1 0x90000000 /boot/d2000v-devboard-dsk-rgmii.dtb
bootm 0x90100000 0x91a00000 0x90000000
ext4load nvme 0:1 0x90100000 /boot/uImage
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 rw';
ext4load nvme 0:1 0x91a00000 /boot/ramdiskfs.gz;
ext4load nvme 0:1 0x90000000 /boot/d2000v-devboard-dsk-rgmii.dtb
bootm 0x90100000 0x91a00000 0x90000000停止自启动程序、设置调试网口ip、挂载文件系统、挂载巨页
killall updata
killall ftransfer
killall remote
killall ipc_server
ifconfig eth1 192.168.4.131
route add default gw 192.168.4.1
mount /dev/nvme0n1p1 /mnt
echo 2000 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir -p /root/huge/
mount -t hugetlbfs none /root/huge/ -o pagesize=2MB
grep HugePages /proc/meminfo
验证链路
ifconfig eth1 promisc
ifconfig eth1 192.168.2.66
arp -s 192.168.2.100 00:11:22:33:44:99
taskset -c 7 iperf -c 16.1.3.100 -u -i 1 -b 1G -t 10
taskset -c 6 iperf -s 16.1.3.100 -u -i 1
iperf -s 192.168.2.2 -u -i 1
iperf -c 192.168.2.100 -u -i 1 -b 2g -t 10
echo Y > /sys/module/xdma/parameters/lo
ifconfig netxdma0 192.168.2.2加载驱动、配置网卡、绑定平台
cd /mnt/boot/root/dpdk/
sh init.sh
ifconfig eth3 promisc
./dpdk-pdevbind.sh -q eth3
./dpdk-pdevbind.sh -b macb_uio 29502000.eth
启动环境验证程序
./dpdk-helloworld --vdev=net_macb,device=29502000.eth启动帧交换程序
./dpdk-frame --vdev=net_macb,device=29502000.eth启动虚拟网卡
./dpdk-frame --vdev=net_macb,device=29502000.eth编写程序:
在框架中的examples目录中编写程序,并且编写meson.build文件
配置环境:
在dpdk目录下,配置arm64环境
meson setup aarch64-linux-gnu-gcc --cross-file config/arm/arm64_armv8_linux_gcc 配置x86环境
meson setup x86-linux-gun-gcc配置编译选项:
进入配置环境构建的目录
cd aarch64-linux-gnu-gcc
meson configure -Dexamples=xxx为example目录下的文件目录
编译:
ninja清除:
ninja -t clean编译出来的文件目录
cd examples/配置arp
/home/wangx/kw/kprl/output/phytium/FT-D2000/FT-DK/host
arp -s 16.1.3.100 FF:FF:FF:FF:FF:FF
arp -s 16.1.3.100 82:BB:79:00:46:CD
修改入参获取方式
echo 128000000 > /proc/sys/net/core/wmem_max
echo 128000000 > /proc/sys/net/core/rmem_max
echo 128000000 > /proc/sys/net/core/wmem_default
echo 128000000 > /proc/sys/net/core/rmem_default
开发板启动系统
setenv serverip '192.168.4.70'; setenv ipaddr '192.168.4.71'; setenv gatewayip 192.168.1.1
tftpboot 0x90000000 boot.img.sig; bootm 0x90000000添加配置文件获取函数
setenv serverip '192.168.4.70'; setenv ipaddr '192.168.4.71'; setenv gatewayip 192.168.1.1;
tftpboot 0x90100000 uImage;tftpboot 0x90000000 phytium-d2000v-54s-new-satellite-control-evb.dtb;tftpboot 0x91a00000 ramdiskfs.gz
bootm 0x90100000 0x91a00000 0x90000000tftpboot 0x90000000 boot.img.sig;bootm 0x90000000
tftpboot 0x90000000 boot1.img.sig;bootm 0x90000000
tftpboot 0x90000000 boot_8bit.img.sig;bootm 0x90000000
tftpboot 0x90000000 boot_16bit.img.sig;bootm 0x90000000
tftpboot 0x90000000 d2000v-cas-throughput-router-evb-boot.img.sig;bootm 0x90000000
tftpboot 0x90000000 d2000v-devboard-dsk_ft.dtb;tftpboot 0x90100000 Image_ft;tftpboot 0x92100000 ramdiskfs.gz
booti 0x90100000 0x92100000 0x90000000
ifconfig eth0 192.168.4.131
ping 192.168.4.116
mw.l 0x281a01cc 0x00
mw.l 0x281a01d0 0x01
mw.l 0x281a01d4 0x01
mw.l 0x281a01d8 0x01
mw.l 0x281a01dc 0x01
mw.l 0x281a01e0 0x01
mw.l 0x281a01e4 0x01
mw.l 0x281a01e8 0x00
mw.l 0x281a01ec 0x00
mw.l 0x281a01f0 0x00
mw.l 0x281a01f4 0x00
mw.l 0x281a01f8 0x00
mw.l 0x281a01fc 0x00
mw.l 0x281a0200 0x00
mw.l 0x281a11d0 0x1100
mw.l 0x281a1198 0x1100
devmem 0x281a01cc 32 0x00
devmem 0x281a01d0 32 0x01
devmem 0x281a01d4 32 0x01
devmem 0x281a01d8 32 0x01
devmem 0x281a01dc 32 0x01
devmem 0x281a01e0 32 0x01
devmem 0x281a01e4 32 0x01
devmem 0x281a01e8 32 0x00
devmem 0x281a01ec 32 0x00
devmem 0x281a01f0 32 0x00
devmem 0x281a01f4 32 0x00
devmem 0x281a01f8 32 0x00
devmem 0x281a01fc 32 0x00
devmem 0x281a0200 32 0x00
devmem 0x281a11d0 32 0x1100
devmem 0x281a1198 32 0x1100
mw.l 0x281a01cc 0x32;mw.l 0x281a01d0 0x32;mw.l 0x281a01d4 0x32;mw.l 0x281a01d8 0x32;mw.l 0x281a01dc 0x32;mw.l 0x281a01e0 0x32;mw.l 0x281a01e4 0x32;mw.l 0x281a01e8 0x32;mw.l 0x281a01ec 0x32;mw.l 0x281a01f0 0x32;mw.l 0x281a01f4 0x32;mw.l 0x281a01f8 0x32;mw.l 0x281a01fc 0x32;mw.l 0x281a0200 0x32
ext4load nvme 0:1 0x90000000 /boot/d2000v-devboard-dsk_54.dtb;ext4load nvme 0:1 0x90100000 /boot/uImage_54;ext4load nvme 0:1 0x92100000 /boot/ramdiskfs.gz;bootm 0x90100000 0x92100000 0x90000000
setenv gatewayip 192.168.4.1;setenv ipaddr 192.168.4.131;setenv serverip 192.168.4.116
tftpboot 0x90000000 phytium-d2000v-cas-demo-evb.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz
bootm 0x90100000 0x92100000 0x90000000
mw.l 0x281a01cc 0x00;mw.l 0x281a01d0 0x01;mw.l 0x281a01d4 0x01;mw.l 0x281a01d8 0x01;mw.l 0x281a01dc 0x01;mw.l 0x281a01e0 0x01;mw.l 0x281a01e4 0x01;mw.l 0x281a01e8 0x00
mw.l 0x281a01ec 0x00;mw.l 0x281a01f0 0x00;mw.l 0x281a01f4 0x00;mw.l 0x281a01f8 0x00;mw.l 0x281a01fc 0x00;mw.l 0x281a0200 0x00;mw.l 0x281a11d0 0x1100;mw.l 0x281a1198 0x1100
ext4load nvme 0:1 0x90100000 /boot/uImage;ext4load nvme 0:1 0x91a00000 /boot/ramdiskfs.gz;ext4load nvme 0:1 0x90000000 /boot/d2000v-devboard-dsk.dtb;bootm 0x90100000 0x91a00000 0x90000000
ifconfig eth0 down
ifconfig eth2 up
ifconfig eth2 192.168.4.131
route add default gw 192.168.4.1
mount /dev/nvme0n1p1 /mnt/
sh /mnt/init.sh
cp /mnt/boot/xdma.ko .
insmod xdma.ko
scp yuanjilin@192.168.1.30:/home/yuanjilin/VC709/networke/frame/output/ftransfer .
echo 1 > /sys/bus/pci/rescan
#内核打印计数
echo 1 > /sys/module/macb/parameters/debug_info
echo 1 > /sys/module/macb/parameters/debug_clear
#配置网卡参数
ifconfig eth1 promisc
ifconfig eth1 192.168.5.66
arp -s 192.168.5.100 00:11:22:33:44:99
ifconfig eth2 promisc
ifconfig eth2 192.168.5.66
arp -s 192.168.5.100 00:11:22:33:44:99ext4load nvme 0:1 0x91a00000 /boot/ramdiskfs.gz;ext4load nvme 0:1 0x90000000 /boot/d2000v-devboard-dsk.dtb;setenv serverip '192.168.4.70'; setenv ipaddr '192.168.4.71'; setenv gatewayip 192.168.1.1;tftpboot 0x90100000 uImage
bootm 0x90100000 0x91a00000 0x90000000
ifconfig eth0 192.168.4.131
killall updata ipc_server remote
echo 1 > /sys/bus/pci/rescan
完善配置文件读取
本地回环测试
iperf -c 16.1.4.101 -u -i 1 -b 100m -t 10
iperf -s -u -i 1
/home/panzhiai/project/558-cnic_cas/linux-kprl
使用google的lsquic
编译boringssl
git clone https://boringssl.googlesource.com/boringssl
cd boringssl
git checkout 9fc1c33e9c21439ce5f87855a6591a9324e569fd
cmake -DBUILD_SHARED_LIBS=1 . && make -j
BORINGSSL=$PWD可能会遇到go版本过低的问题,去go官网下一个最新的,解压到/usr/local目录,然后/usr/bin目录设置一个软连接到/usr/local/go/bin/go,即可
编译lsquic
git clone https://github.com/litespeedtech/lsquic.git
cd lsquic
git submodule update --init
cmake -DLSQUIC_SHARED_LIB=1 -DBORINGSSL_DIR=$BORINGSSL .
make -j服务端:
sudo ./echo_server -s 127.0.0.1:4433 -c www.quic.com,/etc/quic.crt,/etc/quic.key客户端:
./echo_client -s 127.0.0.1:4433
命令行:
gcc echo_client.c prog.c test_cert.c test_common.c -I. -I../include/ -I../../boringssl/include/ -L../../boringssl/crypto -lcrypto -L../../boringssl/ssl/ -lssl -levent -lz -L../src/liblsquic -llsquic -lmmakefile
PRIV_CFLAGS =-g
PRIV_CFLAGS += -I./include/
PRIV_LDFLAGS = -llsquic -lcrypto -lssl -levent -lz -lm
PRIV_LDFLAGS += -L./include/ -Wl,-rpath=./include/
SRCS=$(wildcard include/*.c)
#CC = aarch64-linux-gnu-gcc
CC = gcc
ALL:
$(CC) -o echo_client echo_client.c $(SRCS) $(PRIV_CFLAGS) $(PRIV_LDFLAGS)
$(CC) -o echo_server echo_server.c $(SRCS) $(PRIV_CFLAGS) $(PRIV_LDFLAGS)
clean:
rm echo_client echo_server用法
socat -d -d pty,b115200 pty,b115200创建tap网卡
sudo ip tuntap add mode tap dev tap0
配置ipv6地址
sudo ip -6 addr add 2001:db8::7/64 dev tap0
#0 0x0000ffffbbc9810c in write () from /lib64/libc.so.6
#1 0x0000ffffbbc465bc in _IO_file_write () from /lib64/libc.so.6
#2 0x0000ffffbbc45ce0 in ?? () from /lib64/libc.so.6
#3 0x0000ffffbbc46ae8 in _IO_file_xsputn () from /lib64/libc.so.6
#4 0x0000ffffbbc37674 in ?? () from /lib64/libc.so.6
#5 0x0000ffffbbc35e6c in ?? () from /lib64/libc.so.6
#6 0x0000ffffbbc3ba10 in ?? () from /lib64/libc.so.6
#7 0x0000ffffbbc3bba8 in ?? () from /lib64/libc.so.6
#8 0x0000ffffbbc3bc70 in ?? () from /lib64/libc.so.6
#9 0x0000ffffbbc2971c in ?? () from /lib64/libc.so.6
#10 0x0000000000426b80 in get_mac (dev=0xffffd54f0568 "tap0", dest_mac=0x2ccece12 "") at ../libcommon/src/net.c:805(gdb) frame 10
#10 0x0000000000426b80 in get_mac (dev=0xffffd54f0568 "tap0", dest_mac=0x2ccece12 "") at ../libcommon/src/net.c:805
805 ../libcommon/src/net.c: No such file or directory.
(gdb) info locals
ifreq = {ifr_ifrn = {ifrn_name = "tap0", '\000' <repeats 11 times>}, ifr_ifru = {ifru_addr = {sa_family = 0, sa_data = '\000' <repeats 13 times>}, ifru_dstaddr = {sa_family = 0,
sa_data = '\000' <repeats 13 times>}, ifru_broadaddr = {sa_family = 0, sa_data = '\000' <repeats 13 times>}, ifru_netmask = {sa_family = 0, sa_data = '\000' <repeats 13 times>}, ifru_hwaddr = {
sa_family = 0, sa_data = '\000' <repeats 13 times>}, ifru_flags = 0, ifru_ivalue = 0, ifru_mtu = 0, ifru_map = {mem_start = 0, mem_end = 0, base_addr = 0, irq = 0 '\000', dma = 0 '\000',
port = 0 '\000'}, ifru_slave = '\000' <repeats 15 times>, ifru_newname = '\000' <repeats 15 times>, ifru_data = 0x0}}
sock = 7
(gdb) print dev
$1 = 0xffffd54f0568 "tap0"
(gdb) print dest_mac
$2 = (unsigned char *) 0x2ccece12 ""
(gdb) print ifreq.ifr_hwaddr.sa_data
There is no member named ifr_hwaddr.
(gdb) frame 11
#11 0x000000000040b1fc in get_telemetry (info=0x46d350 <remote_info_s>, data=0x2cceccf6) at remote_utils.c:937
937 remote_utils.c: No such file or directory.
(gdb) info locals
ret = -1
process_info = 0x445c60 <process_info+1144>
t = 1196
app_serial = 1
app_name = 0x46d45a <remote_info_s+266> "remote"
i = 1
tmp = "tap0\000\377\000\000\260\005O\325\377\377\000\000\224\203B\000\000\000\000\000\262\a\000\000\000\000\000\000\001\000\000\000\000\000\000\000\001", '\000' <repeats 15 times>, "\023\000\000\000\000\000\000"
speed = 1970
net = 0x40c920 <exec_request_handle+1036>
(gdb) p &data->vnet_mac
$3 = (uint8_t (*)[6]) 0x2ccece12
(gdb) p &data->vnet_mac
$4 = (uint8_t (*)[6]) 0x2ccece12
(gdb) x/6xb &data->vnet_mac
0x2ccece12: 0x00 0x00 0x00 0x00 0x00 0x000x64d51b448018
0x6e692e35
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/ram0 rw rootwait rootfs_index=1'
- mtd层添加写互斥锁
- 添加rt补丁
- 增加内核日志大小
- 增加互斥锁,解决国产flash挂载ubifs操作异常问题
- 添加lsfo02g的flash支持
cppcheck --enable=all --inconclusive --inline-suppr \
--suppress=missingIncludeSystem \
-I include \
-j 4 \
--quiet \
--output-file=cppcheck.txt \
.
cppcheck --enable=all --inconclusive --inline-suppr \
--suppress=missingIncludeSystem \
-j 4 \
--output-file=cppcheck.txt \
.
setenv serverip 192.168.4.70
setenv ipaddr 192.168.4.131
setenv gatewayip 192.168.4.1
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 solcpus=2-7 root=/dev/ram0 rw rootwait rootfs_index isafety=1 User_Board'
tftpboot 0x90000000 d2000v-devboard-dsk.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz;mw.l 0x28014004 0x300000e;bootm 0x90100000 0x92100000 0x90000000'
ifconfig eth0 192.168.4.131
route add default gw 192.168.4.1 dev eth0
console=ttyAMA1,115200 earlycon=pl011,0x28001000 isolcpus=2-7 root=/dev/ram0 rw rootwait rootfs_index=1 isafety=1 User_Board flash_usage=65535 loglevel=0
run set_net_reg
tftpboot 0x90000000 pd2208-devboard-dsk.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz;
mw.l 0x28014004 0x300000e;
bootm 0x90100000 0x92100000 0x90000000
条目格式
<id>:<runlevels>:<action>:<command>
<id>:条目标识符(唯一,通常为空或简短字符串)。<runlevels>:运行级别(BusyBox 中通常忽略,保留为空)。<action>:触发动作(如sysinit、respawn、ctrlaltdel等)。<command>:要执行的命令或脚本。
触发动作包括:
- sysinit:系统启动指向的初始化操作,安装顺序执行所有sysinit条目
- ctrlaltdel:当用户按下
Ctrl+Alt+Del组合键时执行重启操作 - shutdown:系统关机或者重启时执行
- respawn:监控应用程序,若进程退出则自动重启
- askfirst:控制台启动前等待用户按下Enter键
- wait:执行命令并且等待其完成之后,再继续后续初始化(阻塞)
- once:执行一次
- restart:当init进程收到SIGHUP信号时重新执行命令
示例:
# 系统初始化阶段
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -t tmpfs tmpfs /tmp
::sysinit:/bin/hostname -F /etc/hostname
::sysinit:/etc/init.d/rcS
# 控制台配置
tty1::respawn:/sbin/getty -L tty1 115200 vt100
tty2::askfirst:/bin/sh
# 关键进程监控
::respawn:/usr/sbin/dropbear -R # SSH 服务
::respawn:/usr/bin/myapp
# 系统事件
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/init.d/rcK
::shutdown:/bin/umount -a -r
quic- 重构协议
- 负载均衡
- 串口平替
- 日志下传编码
| 说明 | 环境变量名称 |
|---|---|
| quic使能 | QUIC_ENABLE |
| FEC使能 | QUIC_FEC_ENABLE |
| FEC编码率 | QUIC_FEC_ENCODING_RATE |
| FEC有限域元素的位数 | QUIC_FEC_FIELD_BITS |
| FEC块(block)中的最大符号(symbol)数量 | QUIC_FEC_MAX_SYMBOLS |
| FEC最大符号大小 | QUIC_FEC_MAX_SYMBOL_SIZE |
| FEC当前主机可以存储最大块数量 | QUIC_FEC_MAX_BLOCKS_NUM |
| 受到FEC保护的帧类型 | QUIC_FEC_SAFE_FRAME_TYPES |
| FEC编码方式 | QUIC_FEC_ENCODING_MODE |
| 日志等级 | QUIC_LOG_LEVEL |
| 拥塞算法 | QUIC_CONGESTION_ALGORITHM |
| 连接超时时间 | QUIC_CONNECTION_TIMEOUT |
| Reinjection机制 | QUIC_REINJECTION_MODE |
0x1072008是没问题的 0x1411000有问题
./reg_rw /dev/xdma0_user 0x1072008
./reg_rw /dev/xdma0_user 0x1411000killall mgrlog proxy_xdma ftransfer updata remote kx ipc_server
历史版本
7bb899c40f6379e93a4936eb39e328f27ecbcb79
调试debug版本
50目录
/home/jrlc/xdma/debug_xdma/xdma需要配置参数
echo 1 > /sys/module/xdma/parameters/test_num
echo 1 > /sys/module/xdma/parameters/read_debug_timeouttest_num是间隔多少包打印一次
read_debug_timeout是超时时间配置
commit号
updata - 4ee9e4a3
remote - c5251f63
ftransfer - 41da871f
改动说明:
- 添加重庆的bin库内容到/bin目录
- 添加重庆的lib库到/usr/lib目录(除了libapp.so)
- 新增加/opt/cscn/目录
- 帧交换启动脚本添加加载驱动操作
- 帧交换停止脚本添加卸载驱动操作
- 自启动脚本删除解压高层操作
- 自启动脚本取消执行帧交换操作,目前用户板卡只执行/opt/app/start.sh
不开统计 1M的数据花费0.13s 100M的数据花费4m 43.73s
开统计 1M的数据花费1.59s 18.1M的数据花费20m 14.60s
看门狗线程:watchdogd
会议时间:2025年5月17日
网络转发方案亮点: 原生生态兼容:采用内核透传机制,在不触及现有生态软件底层网络通信协议与架构的前提下,实现新旧网络体系的平滑过渡。既避免了大规模软件重构带来的风险与成本,又确保原有业务系统的稳定运行,保障星间网络升级过程中业务连续性与兼容性。
空间弱网增强传输:针对星间网络高抖动、高延迟特性,定制化开发弱网优化算法。通过智能拥塞控制、快速重传机制与数据包冗余传输等技术,有效降低网络丢包率,显著提升极端网络环境下数据传输的稳定性与实时性。
高性能转发:从内核级优化数据处理流程,减少数据拷贝与协议解析开销,大幅提升网络转发效率,满足星间网络大容量、高速率的数据传输需求。
高性能转发: 0拷贝技术
硬件加速
8f739983a065f167df604812cfbdd2d03f681758
uboot配置网卡
run set_net_reg配置网卡寄存器,内容如下
mw 0x281a01d0 0x31; mw 0x281a01d4 0x31; mw 0x281a01d8 0x31; mw 0x281a01dc 0x31; mw 0x281a01e0 0x31; mw 0x281a01e4 0x31; mw 0x281a11d0 0x1100; mw 0x281a1198 0x1100
设置ip地址
setenv serverip 192.168.4.70
setenv ipaddr 192.168.4.92
setenv gatewayip 192.168.4.1
tftp启动
tftpboot 0x90000000 d2000v-cas-throughput-router-evb-boot.img.sig
run set_net_reg
fatload nvme 0:1 0x90000000 /cas.dtb;fatload nvme 0:1 0x91a00000 /cas_ramdiskfs.gz;fatload nvme 0:1 0x90100000 /cas_uImage;
bootm 0x90100000 0x91a00000 0x90000000
tftpboot 0x90000000 phytium-d2000v.dtb;tftpboot 0x90100000 uImage;tftpboot 0x92100000 ramdiskfs.gz;
mw.l 0x28014004 0x300000e;
bootm 0x90100000 0x92100000 0x90000000;
关于pcieX8的问题正在积极和客户沟通,目前客户这边还在准备环境阶段,客户环境具备之后咱们抓紧分析,争取早日解决
ifconfig enaphyt4i0 192.168.4.72
route add default gw 192.168.4.1 dev enaphyt4i0
root
Kylin123123
#设置环境变量
source ../settings.sh
#使用 zynq 这个模板创建一个名为 system 的petalinux 工程
petalinux-create -t project --template zynq --name system
#获取上一级文件夹中的 xsa文件
petalinux-config --get-hw-description ../
#编译
petalinux-build
#打包
petalinux-package --boot --u-boot --fpga --force
#清除缓存
petalinux-build -x cleanall
# ERROR: Failed to create workspace directory
rm build/bitbake.lock核隔离
isolcpus=2-7
日志等级
loglevel=7
自启动设置
vim /etc/inittab::respawn:sleep 1/sbin/remote重新挂载
mount -o remount,rw /mnt/iperf3 -s
iperf3 -c 127.0.0.1 -u -b 100G -t 60iperf -c 127.0.0.1 -u -i 1 -b 1G -t 10
iperf -s -u -i 1修改远程仓库
git remote set-url origin addr回退本地提交
git reset --soft HEAD^
// 这里的 HEAD^ 意思是回退到上一个版本,可以写成 HEAD~1
// 如果 commit 了两次,两次都想回退,可以写成 HEAD~2删除远程分支
git push origin --delete test恢复干净目录
git clone -df
修改portid为portmask,并且添加list数组存储mask转换的id;修改pcie初始化,判断释放配置为串口模式;添加全局参数配置文件处理;添加xdma设备id绑定;
git commit -m "feat(mode): 配置文件添加mode标识配置文件模式,添加mode处理,添加遥测ft_mode和3个接口的模式"
添加获取帧交换配置文件的网卡id函数;添加gpio相关函数
添加入参检测;添加遥控指令处理;添加遥测处理
经领导批准,采购了5个cursor账号(3个月的),大家可按小组自行分配,使用后对工作确有帮助的话,按需继续采购
欧拉组、总工: 2017496ap@unicla.edu.mx----casaca1241ed a12021260@iteshu.edu.mx----jgh5463tru5 业务组: 2017421u@unicla.edu.mx----jgh5463tru5 鲲鹏组: a12021309@iteshu.edu.mx----xcv3124r1dq1221 jari组: a12021311@iteshu.edu.mx----xcv3124r1dq1221
linux c实现以下需求: 1、使用共享内存+通知机制,实现两个进程间通信 2、共享内存大小为4k对齐并且连续的1024x32kByte的环形队列,每次写最多写1600Byte,最少100Byte,另外给每个32k队列开辟一组共享内存数组(最好在前面共享内存1024X32kByte内存后面分配1024个队列的数组,不能影响4k对齐并且连续的1024x32kByte)标识写的每个数据(100-1600)的长度,例如写入两个数据1600Byte和1500Byte,则数组0标识1600,数组1标识1500,数组2为0 3、写入函数每次写入需要在前面空出64字节(可配置),后面空出20字节并且8字节对齐(20-28字节,可配置),偏移量为64字节起始位置,下一个偏移量从20字节下一位,写满32k(或者最后不足1600Byte),通知接收程序获取 4、读取函数收到通知之后,根据共享内存数组里存放的偏移,依次获取32k里的数据 5、构建一个结构体来两个程序方便访问,包含data指针,标识指针,
1、通知机制使用高效的,不限制方式 2、两个进程固定一读一写 3、暂时不用支持多进程读写 4、需要在实际地址上保留,例如第一次写数据,写入1200字节,实际上是从第64字节开始写1200字节,最后在1200+64+20+8字节对齐填充的位置开始下一次写数据 5、必须达到32k数据剩余部分小于1600才触发
定时器?
写几个linux C相关的函数实现以下功能:
函数1:添加一个新的表项或者修改已有表项,先检查是否已经存在该表项,(例如,现在存在::respawn:ipc_server -l 3 -f,添加新表项ipc_server -l 3 -p,则将原有表项删除,添加为新表项::respawn:ipc_server -l 3 -p;如果添加新表项test,没有匹配表项,则直接添加::respawn:test)
函数2:删除表项,传递参数ipc_server,则删除与ipc_server相关的表项
函数3:根据程序名称,停止应用程序进程
函数4:执行linux c命令
tmrcp write a b:复制a文件到b文件,并且复制3份,其他两份目录结构类型b_1,b_2
tmrcp read a b:复制a文件到b文件,需要读取a,a_1,a_2文件其中两份,无差异则直接复制到b,否则需要和另外一份对比,找到两份一模一样的
linux c写一个函数,实现如下功能: 1、入参是一个uint8_t型的mask,一个uint8_t型的指针ptr 2、获取mask二进制中所有包含1的位置,并且填充到指针里,例如0b00001111,则填充ptr[0]=0,ptr[1]=1,ptr[2]=2,ptr[3]=3 3、返回1的数量,案例这里返回4
构建
ctags –R .跳转
Ctrl + ]
回退
Ctrl+ t
# 清空规则链
iptables -F
iptables -X
iptables -Z
# 允许回环接口(必须优先配置)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许 eth1 的 UDP 流量(规则必须放在 DROP 之前!)
iptables -A INPUT -i eth1 -p udp -j ACCEPT
iptables -A OUTPUT -o eth1 -p udp -j ACCEPT
# 拒绝 eth1 的其他所有流量(显式阻断,增强可读性)
iptables -A INPUT -i eth1 -j DROP
iptables -A OUTPUT -o eth1 -j DROP
iptables -A FORWARD -i eth1 -j DROPyocto直接在文件系统编译gcc是一件很麻烦的事情,这里采用做好一个文件系统之后,直接在ubuntu编译好openEuler版本的gcc,将依赖和环境拷贝到文件系统,尝试是否可行。
编译环境准备
sudo apt update
sudo apt install -y build-essential libgmp-dev libmpfr-dev libmpc-dev \
flex bison libisl-dev texinfo gawk libzstd-dev下载源码
https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/解压
tar -vxf gcc-7.3.0.tar.xz
./contrib/download_prerequisites
开始编译,创建一个临时目录存放最终生成的文件
./configure --prefix=/tmp/openeulergcc
make
make install最终生成的文件在目录/tmp/openeulergcc,整体拷贝到文件系统里即可
以上只能本地编译
交叉编译很麻烦,使用quem本地编译
配置临时交叉编译环境
export PATH=/home/jrlc/tools/openeuler_gcc_arm64le/bin:$PATH
安装ccahe
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/8/Everything/aarch64/Packages/c/ccache-3.7.7-1.el8.aarch64.rpm
ifconfig enp125s0f0 192.168.4.132
route add default gw 192.168.4.1输入指令:
sqlite3 -- 创建表
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
-- 查询数据
SELECT * FROM users;
SELECT name, email FROM users WHERE id > 1;
-- 更新数据
UPDATE users SET email = 'bob.new@example.com' WHERE name = 'Bob';
-- 删除数据
DELETE FROM users WHERE id = 1;
输入指令:
redis-cliPING
set value0 1234
get value0
出现ModuleNotFoundError: No module named 'pysmx'
pip install snowland-smx
sudo apt install python3-pyelftools
测试
from pysmx.SM3 import digest as SM3_pysmxmkimage -n 'linux phytium' -A arm64 -O linux -T kernel -C gzip -a 0x80080000 -e 0x80080000 -d arch/arm64/boot/Image.gz arch/arm64/boot/uImage.gzmake BRCMD=uboot
make modules_install INSTALL_MOD_PATH=mod_install_dir编译内核的时候选择
make rpm-pkg需要安装rpmbuild命令,直接apt安装就行
编译完成之后会在目录生成相应文件
cd ~/rpmbuild/RPMS/aarch64
ls
kernel-5.10.0-2.aarch64.rpm kernel-devel-5.10.0-2.aarch64.rpm kernel-headers-5.10.0-2.aarch64.rpm将文件拷贝到目标板,安装
sudo dnf install -y ./kernel-5.10.0-2.aarch64.rpm \
./kernel-devel-5.10.0-2.aarch64.rpm \
./kernel-headers-5.10.0-2.aarch64.rpm
会在/boot目录生成内核、文件系统以及grub配置
mkimage -n "ramdiskfs" -A arm64 -O linux -T ramdisk -C gzip -d rootfs.cpio.gz ramdiskfs.gzdtc -I dtb -O dts -o xxx.dts system.dtbkprl选择bsp包的时候找不到对应的内容,删除.work目录
find . -type f -exec dos2unix {} \;
中科院或者54的内核想要运行在开发板上,并且挂载sata或者ssd,需要选上文件系统格式ext4/3/2(ssd),在驱动选择serial ata,并且勾选sisc协议才能支持sata
sudo dpkg-reconfigure dash选中是/否切换
解压isafety.tar.gz
进入image_fix_0909
执行./my_scripts/fix_parameter.sh进行配置
使用打包工具单独编译uboot需要先编译uboot源码,将编译完成的uboot拷贝到目录image_fix_0909并且重命名bl33_new.bin
退回到isafety执行make pack_0909
动态库添加遥控指令和轮询帧处理,并且根据协议填充帧头2字节协议轮询0x1199,遥测0x11aa,遥控0x11bb;修改时间同步协议;
修改image-fix.sh的bl33_base
修改为uboot的menuconfig里的参数
Boot images --->
make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- menuconfig修改lbc启动uboot为qspi启动uboot
- 更换打包工具为qspi打包工具
- 修改uboot源码
include/configs/D2000V.h
匹配上面提到的地址
在轨问题测试分析 1、确认在轨遥测帧是否有收到(54) 2、布置地面测试环境复现问题(54提供硬件环境,JR提供软件环境)(已完成环境部署,等待问题复现) 3、测试在固化位置读flash时断电,下电复位cpu启动上注位置是否正常启动(54提供硬件环境和发遥控环境,JR测试)
后续优化: 1、同步新星uboot下的qspi寄存器修改到组网的uboot(JR) 2、本质安全uboot下度量内核结果与上次一致则不重复写flash,减少flash写入次数(JR)(已完成) 3、本质安全系统下静态度量结果不写flash,存储到内存即可,减少flash写入次数(JR) 4、新星的有一块flash存在问题提供提供说明档(JR)
可靠性设计:
1、关键数据三模:类似重构的关键数据,在内存中存储3份,最终写入的时候读取数据写入;
2、配置文件备份:配置文件存储3份,获取的时候逐一对比3份文件的内容;
3、内存ECC功能:飞腾芯片支持内存ECC功能,可以纠一检二
1、17.5.10.11(31c1)、18.17.15.11(32c5,32c6)、18.17.13.11(32ca)这3颗星的4个板卡是否一直都有uboot启动度量失败,继续观察----54
2、确认18.17.15.11是本组的第几颗星(只有第一颗星会做异常测试,但31c1那颗星应该没做过异常测试)----54
3、继续分析除了重构和手动异常测试外,是否还会有其他改写hash值的原因----JR
4、思考遥控修正hash值的方案----JR
5、整理本次度量失败问题分析报告----JR
工作内容:组网星flash做单粒子翻转检测 遇到问题:无 明日计划:修改内核测试并且校验
整体框架修改,现在单独编译动态库,不用合并到高层程序,可以自己测试
printf("[%s:%s:%d] test\n", __FILE__, __func__, __LINE__);fprintf(stderr, "%s: %d return = %d errno = %d (%s)\n", __FUNCTION__, __LINE__, nr, errno, strerr(errno));
fflush(stderr);insmod /opt/ngbe.ko
echo Y > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
echo 10ee 7032 > /sys/bus/pci/drivers/vfio-pci/new_id
ifconfig enp1s0 192.168.1.3
ifconfig enp1s0 down
ifconfig enp1s0 up
ifconfig enp1s0 192.168.1.3
./vfio 0 0000:05:00.0
insmod /opt/xdma.ko
./ftransfer --show_speed --c2h /dev/xdma0_c2h_0 --h2c /dev/xdma0_h2c_0
/sys/class/uio/uio0/maps/map0/addr
echo "10ee 7032" > /sys/bus/pci/drivers/uio_pci_generic/new_id
echo 0000:05:00.0 > /sys/bus/pci/devices/0000:05:00.0/driver/unbindresult=$(cat /proc/cmdline | grep -o '\w*_Board')
if [ "$result" = "Control_Board" ]; then
echo "control board, tar zxf upf"
else
echo "user board, tar zxf app"
fi状态检测设计:定时去检测目标程序是否运行,检测cpu状态,例如cpu占有率,内存使用率,cpu温度等信息。
遥控遥测测试方案:由管理平台发送串口数据给遥控遥测模块,测试遥控遥测转发功能、定时功能
在公司服务器设置了局域网代理,居家办公无法使用,并且无法连接网络
# export -p查看所有与代理相关的东西,使用unset取消设置,例如
# unset http_proxy修改文件内容
# vim ~/.gitconfig# vim ~/.bashrc# vim ~/.wgetrc完成!
入职时独立完成raid板卡项目的测试工具开发工作,主要使用python语言实现客户要求的测试项目,最终成功交付项目
sparc系统软件移植,主要是将一些测试软件和功能移植到sparc系统里,包括但不限与可执行文件,动态库等方式
参与飞腾板卡测试工作,主要负责对板卡的功能进行测试和验证,其中包括硬盘速率测试、网速测试、串口功能验证、can接口,GPIO接口测试等功能
星网项目负责参与软件功能实现,现有的软件都是由我负责编写验证和维护
完成raid板卡项目交付,完成飞腾板卡测试工作,完成sparc系统软件移植工作,目前星网项目正在参与,是重要的软件研发人员
熟练使用git管理和维护项目、链表、结构体、指针
- 维护自己的lib库
- 协议与框架分离,修改新协议的时候可以直接替换文件
整合项目库文件(长期任务)
写一个软件版本控制函数,要求入参为软件版本号,1字节,固定写文件/etc/app_version,往这个文件写入字符串,格式是 程序本身名称=0x01,例如app0执行这个函数就是app0=0x01,并且执行写入之前检查是否有对应的内容,例如,app0版本为0x02,如果已经存在app0=0x01,那么久修改后面的版本号
export http_proxy=http://192.168.4.70:7410 https_proxy=http://192.168.4.70:7410 all_proxy=socks5://192.168.4.70:7410
Tidying up Go HTTP Server Install Your IP/DNS Address is 8.156.82.106 Your public key is UcJHD8BDSQ+jtteOzvUV95I2PJK6HzqhfNN4fNxK3HM= Install Rustdesk on your machines and change your public key and IP/DNS name to the above You can access your install scripts for clients by going to http://8.156.82.106:8000 Username is admin and password is WjMM8AjbSIdPA1tq Press any key to finish install
UcJHD8BDSQ+jtteOzvUV95I2PJK6HzqhfNN4fNxK3HM=























































































