好像在一开始搭建这个博客的时候,我是打算写一个技术类的博客的,结果技术类的东西没写什么,倒是发了几篇随笔。当然了,客观条件是随笔本来有些积累的文章,而技术方面的东西一直以来积累不多,但是另一方面主观地讲,我也有点总觉得技术内容不好编排,不好写好,容易出纰漏,容易不成条理。
不过我又想,即使是如此,写下来也比不写好,即使是随便记录下的一点指南一点笔记,说不定也会在后面的开发中起到作用,或者得到进一步的完善。比如说Beaglebone的那篇实验的README,虽然太监到现在,但是及时地写下那些记录,一直以来都在使我受益。
话说回来,打气的大道理说多了我自己也烦,不如就这样开始新的旅途吧,“与其坐而论道,不如起而行之”。
玩家
2022年1月16日于仙林
驱动与调试
linux版本的vivado需要安装驱动才能调试。
驱动位置在安装目录下的data/xicom/cable_drivers/lin64/install_script/install_drivers
目录,安装完之后重启就行。
参考:https://support.xilinx.com/s/question/0D52E00006iI3y1/unable-to-connect-to-hardware-target-in-vivado?language=en_US
Xilinx的UG973也有提到
ILA
被ILA的信号是有可能在implementation的时候被优化的,具体表现为ILA中显示的信号被拆分或者丢失,有两个方法,要么在信号上加入(* dont_touch = “true” * )
约束(但是似乎和mark_debug冲突,不太清楚两个一起用的语法该怎么写),要么就给待调试信号找个地方接上。
理论来说mark_debug的信号好像不会被优化的,但是实际上就是没了:(
参考:https://blog.csdn.net/qq_45922361/article/details/108664679?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.no_search_link&utm_relevant_index=9
https://blog.csdn.net/lee008108/article/details/105806737
ILA会加入很多逻辑,要确保资源够用,另外ILA对时序有一定的要求,如果差太多会导致采不出数据,具体表现为在调试界面按了trigger之后一片空白而且报错,需要在Setup Debug的时候设置下input pipe stage,网上的资料似乎建议最少要2(不过有的时候不设也能调),我一般设置2或者3,还没遇到需要更高的情况。
增加的pipe stage需要更多的DFF,所以更要关注资源够不够。
参考:https://zhuanlan.zhihu.com/p/358088040
https://blog.csdn.net/qq_33155311/article/details/107839056
编译内核
目前用的是ADI改版代码,分支为2019_R1。
https://github.com/analogdevicesinc/linux.git
先source env.sh
env.sh如下:
source /tools/Xilinx/SDK/2018.3/settings64.sh
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
在xilinx_zynq_defconfig基础上修改:
不要用这个xilinx_zynq_defconfig!直接用zynq_xcomm_adv7511_defconfig
make zynq_xcomm_adv7511_defconfig
make menuconfig
配置项目有:
General setup->
Cross-compiler tool prefix = arm-linux-gnueabihf-
Default hostname = NJURadio
System Type->
Xilinx Zynq ARM Cortex A9 Platform = 确保是Y
Kernel Features->
Memory split = 2G/2G或者1G/3G user/kernel,我选了前者
High memory support = 确保是Y
Networking Support->
Networking Options->
The IPv6 Protocal = Y->
802.1d Ethernet Bridging = 以后说不定要用?
Device Drivers->
Generic Driver Options->
Userspace firmware loading support = 确保是Y
SPI support->
Analog Devices AXI SPI Engine controller = Y
Analog Devices AD-FMCOMMS1-EBZ SPI-I2C-bridge driver = Y
Analog Devices AD9250-FMC-250EBZ SPI-SPI-bridge driver = Y
User mode SPI device driver support = Y
MMC/SD/SDIO card support = 确保是Y,姑且认为里面的东西ADI给配好了
!!!!!!!!!!!!!!测试:已删除
SDHCI support on PCI bus = Y,根据YPX的经验
SDHCI OF support for the Atmel SDMMC controller = Y,根据YPX的经验
SDHCI support for the Cadence SD/SDIO/eMMC controller = Y,根据YPX的经验
SDHCI support for Fujitsu Semiconductor F_SDH30 =Y,根据YPX的经验
!!!!!!!!!!!!!!!!!!!!!
DMA Engine support = 确保是Y,姑且认为里面的东西ADI给配好了
Remoteproc drivers->
Support for Remote Processor subsystem = Y
Support ZYNQ remoteproc = 我从M改成了Y,不知道有没有影响
!!!!!!!!!!!!!!测试:已删除
SOC (System On Chip) specific Drivers->
Xilinx SoC drivers->
Xilinx VCU logicoreIP Init = ?
!!!!!!!!!!!!!!!!!!!!!
Industrial I/O support-> **把所有和Analog有关的都勾上,参考zynq_xcomm_adv7511_defconfig**
Frequency Synthesizers DDS/PLL->
Direct Digital Synthesis->
Analog Devices CoreFPGA AXI DDS driver = Y,根据WJZ的经验
Analog to digital converters->
Analog Devices AD9467 etc. high speed ADCs = Y,按照ADI教程是Analog Devices AD9467 AD9643 High-Speed AXI ADC driver
Analog Devices AD9361, AD9364 RF Agile Transceiver driver = Y,虽然教程没说要,但根据WJZ经验先加上
File systems->
Miscellaneous filesystems->
SquashFS 4.0 - Squashed file system support = Y,计划中是使用ext4作为rootfs的,为了兼容性先加上
Network File Systems->
NFS client support for NFS version 4 = Y
Root file system on NFS = Y,后续如果能NFS启动应该会方便调试一点
Kernel Hacking->
Compile-time checks and compiler options->
Debug Filesystem = Y,根据WJZ的经验
然后开始编译内核:
make -j6 UIMAGE_LOADADDR=0x8000 uImage
0x8000是YPX和GBW笔记中使用的地址,按照WJZ的建议,我们在ADI原版demo的基础上修改,准备设置为0x30000000实际上就是这个地址,不用改了。
make -j6 UIMAGE_LOADADDR=0x30000000 uImage
最后安装下内核模块
make modules
sudo make INTSLL_MOD_PATH=/media/minaduki/rootfs/ modules_install
INTSLL_MOD_PATH要设置为根文件系统的目录!而不是/lib/modules!
报错mkimage command not found – U-Boot images will not be built
尝试安装u-boot-tools解决。参考:官方:https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9361
YPX的笔记:https://spiky-gosling-941.notion.site/squashfs-njuradio-ko-89e59ccae7f545bdb21ba432363f6bf3
GBW的笔记:https://www.notion.so/be07e47f6fd44f8081f75ed5058c494f
https://www.cxyzjd.com/article/qq_15100379/114740562
make modules 和 make modules_install_hello_courage的博客-CSDN博客_make modules_install
测试一下
把官方例程烧入sd卡:
sudo dd if=2019_R1-2020_06_22.img of=/dev/sdb bs=4194304
确保是从外置SD卡启动:如果以板子上的ADI丝印为方向指示,则S1应拨到左边,S3和S4应拨到右边。
使用官方例程启动,需要将zynq-common下的uImage文件和zynq-adrv9361-z7035-bob(我们使用的开发板)下的devicetree.dtb和BOOT.BIN文件拷贝到SD卡根目录下面。
官方例程启动正常,接下来用上一步得到的uImage替代官方uImage启动,正常启动。
但是,在自定义版本的/dev
目录下,仅能看见两个iio\:device,而正常应该有4个,查阅/sys/bus/iio/devices
目录下各个设备的name信息,发现成功显示的两个设备分别是ad9361-phy和xadc,而官方例程中还有cf-ad9361-dds-core-lpc和cf-ad9361-lpc,另外,官方例程在/sys/bus/iio/devices
目录下还有一个iio_sysfs_trigger目录。
最后解决方案:使用zynq_xcomm_adv7511_defconfig代替xilinx_zynq_defconfig作为配置基板,就可以正常使用ad9361驱动。
e2fsck命令可以检查ext4文件系统是否正常
自动升级固件
本来想通过uEnv.txt改成tftp启动的,结果ADI的u-boot似乎有些bug,会显示脚本语法错误,具体是加载uEnv.txt的命令
loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}
这句话执行的时候会提示load命令不存在,换成fatload就正常了。
那就只能用不太优雅的方式了,手动改掉u-boot的环境变量:
setenv tftpsetenv "setenv ipaddr 192.168.3.27; setenv serverip 192.168.3.102;"
setenv tftpgetimage "tftpboot 0x3000000 ${kernel_image}; tftpboot 0x2A00000 ${devicetree_image};"
setenv tftpbootargs "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlycon rootfstype=ext4 rootwait cpuidle.off=1"
setenv minaduki_tftpboot "run tftpsetenv; run tftpgetimage; setenv bootargs ${tftpbootargs}; bootm 0x3000000 - 0x2A00000;"
setenv uenvboot "run minaduki_tftpboot"
然后saveenv
一下这样以后每次启动时,都会自动从tftp服务器拉取内核和设备树。
说来这saveenv是save到哪儿的?改天去想想
save到了开发板的SPI Flash上,换一个BOOT.BIN的时候这些东西还在,可以证明(或者saveenv的时候也有提示)。
WJZ重新编了个u-boot,新的u-boot裁剪没那么多了,可以改回uEnv.txt的方式,毕竟这样还是优雅一点,可以在线更新参数。
localip=192.168.3.27
remoteip=192.168.3.102
gwip=192.168.3.1
mask=255.255.255.0
modeboot=minaduki_tftpboot
bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlycon rootfstype=ext4 rootwait cpuidle.off=1
tftpsetenv=setenv ipaddr ${localip}; setenv gatewayip ${gwip}; setenv netmask ${mask}; setenv serverip ${remoteip};
tftpgetimage=tftpboot 0x3000000 ${kernel_image}; tftpboot 0x2A00000 ${devicetree_image};
uenvcmd=run minaduki_tftpboot
minaduki_tftpboot=run tftpsetenv; run tftpgetimage; bootm 0x3000000 - 0x2A00000;
加了modeboot=minaduki_tftpboot就能自动启动了,否则总会跑到sdboot那边,不知道为啥
找个时间把NFS rootfs也搞定
实现网络启动
如果需要网络启动,则编译内核时应该加上对nfs根文件系统的支持
File systems->
Network File Systems->
Root file system on NFS = Y
然后编辑/etc/exports文件,设置nfs的目录
/srv/nfs *(rw,sync,no_subtree_check,no_root_squash)
/srv/nfs/nfsboot/rootfs *(rw,sync,no_subtree_check,no_root_squash)
本来想使用ADI官方镜像的rootfs的,但是启动会卡住,所以最后选了linaro,把文件解压到nfs目录下
sudo tar --strip-components=1 -C /srv/nfs/nfsboot/rootfs/ -xzpf linaro-utopic-server-20150421-702.tar.gz
ADI官方用的版本和这个不一样,strip层级要改一下
然后编辑uEnv.txt
localip=192.168.3.27
remoteip=192.168.3.102
gwip=192.168.3.1
mask=255.255.255.0
modeboot=minaduki_netboot
tftpsetenv=setenv ipaddr ${localip}; setenv gatewayip ${gwip}; setenv netmask ${mask}; setenv serverip ${remoteip};
tftpgetimage=tftpboot 0x3000000 ${kernel_image}; tftpboot 0x2A00000 ${devicetree_image};
nfssetenv=setenv nfsargs nfsaddrs=${localip}:${remoteip}:${gwip}:${mask}
nfssetrootfs=setenv rootfs root=/dev/nfs rw nfsroot=${remoteip}:/srv/nfs/nfsboot/rootfs,vers=3
setbootargs=setenv bootargs console=ttyPS0,115200 $rootfs $nfsargs earlycon rootwait cpuidle.off=1
uenvcmd=run minaduki_netboot
minaduki_netboot=run tftpsetenv; run tftpgetimage; run nfssetenv; run nfssetrootfs; run setbootargs; bootm 0x3000000 - 0x2A00000;
用了那么多setenv其实有点丑,但是否则的话运行时有不少env不会被解析,可能还是不太了解u-boot具体运行的原因。
由于采用了nfs启动,所以不会再用dhcp配置网络,dns服务器需要通过修改/etc/resolv.conf
指定
参考:https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/linux/zynq
在rootfs上配置Linaro
由于版本太古老了又不是LTS,所以修改下/etc/apt/sources.list,改为从xenial偷apt包用。
(本来想偷trusty的,觉得xenial新了点可能有依赖问题,结果trusty反而有依赖问题)。
配了apt就可以装build-essential了,装完编译libiio。
看ADI的github项目,似乎有预编译好的binary,不知道能不能直接用,先下了看看
1月19日:由于目前的需求暂时不需要在开发板本地开发,所以直接apt安装iiod,这样就可以在其他设备上用ip的uri调用了。
编译U-boot
配置设备树
zynq-adrv9361-z7035-bob
配置设备树遇到了一个问题,一部分内存应当留给CPU1用,但是在设备树里面设置了reserved memory却并不管用
reserved-memory {
#address-cells = <0x1>;
#size-cells = <0x1>;
ranges;
rproc@30000000 {
no-map;
reg = <0x30000000 0x0F000000>; //起始地址,大小
};
};
remoteproc@0 {
compatible = "xlnx,zynq_remoteproc";
firmware = "firmware";
interrupt-parent = <0x4>;
//定义中断:控制器 编号 类型 控制器 编号 类型...
interrupts = <0x0 0x1d 0x4 0x0 0x3b 0x4>;
vring0 = <0xf>;
vring1 = <0xe>;
srams = <0x11>; // 在此处定义
};
amba {
u-boot,dm-pre-reloc;
compatible = "simple-bus";
#address-cells = <0x1>;
#size-cells = <0x1>;
interrupt-parent = <0x4>;
ranges;
ddr@30000000 {
compatible = "mmio-sram";
reg = <0x30000000 0x0F000000>; // 大小需要小于reserved-memory
linux,phandle = <0x11>;
phandle = <0x11>;
};
ddr需要小于reserved是因为,reserved的最后1M是留给DMA的,DMA需要CPU0能够访问,但是在cat /proc/iomem的时候发现,如果ddr的内存比reserved小,则多的部分会被linux吃掉变成System RAM,如果一样,则会和内核打架,造成kernel panic。
我初步怀疑是我编译的内核中有配置项目不正确,但是短时间找不出来。
目前打算在u-boot的bootargs中加入mem=512M
或其他容量,手动限制linux的内存,明天来看看有没有作用。
第二天:加入之后确实不会panic了,但是DMA还是读不出。
第三天:伟大光辉正确的BIGWJZ通过修改了一个错误的宏展开,解决了DMA地址问题,感谢BIGWJZ。
哈哈,重装了
minicom有关
装了新系统,结果minicom突然键盘没法输入了:
是因为串口配置里面把Hardware Flow Control打开了,关掉就行。
挂载lvm
装了新系统要重装Vivado,结果有安装包的老硬盘是lvm的,要这样挂载:
先用apt装下lvm2这个包,然后就可以把/dev/mapper/vgubuntu-root/
挂载到想要的地方了(未必叫vgubuntu-root)
安装vivado
然后安装vivado的时候卡住了
多亏我还没完全老年痴呆,去年遇到同样的问题,是因为缺了一个libncurses的包:
sudo apt install libncurses5 libncurses5-dev libtinfo5
装上就好了
注意!Vivado依赖的是libncurses5,而现在的系统包管理一般默认安装libncurses6,是不能兼容的,必须指定版本。
参考:Xilinx Vivado (简体中文) – ArchWiki
安装依赖
按照IIO Oscilloscope安装教程来:https://wiki.analog.com/resources/tools-software/linux-software/iio_oscilloscope
装完后在.bashrc最后加上
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:
将频谱功能进行迁移
主要需要两个工作,一个是网页服务器,一个是Python的pyadi-iio模块。
网页服务器
linaro发行版自带了apache2,因此直接选用apache2。由于要用到反向代理,需要load相关的module。
结果发现apache的配置和Nginx区别还不小,那还是用nginx吧。
server {
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;
root /var/www/minaduki-spec;
index index.html index.htm;
# Make site accessible from http://localhost/
server_name localhost;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
location /api {
proxy_pass http://127.0.0.1:5088/;
}
}
proxy_pass http://127.0.0.1:5088/;
和proxy_pass http://127.0.0.1:5088;
的表现是完全不同的,前者在访问http://serverip/api
时会代理给http://127.0.0.1:5088/
,而后者则会代理给http://127.0.0.1:5088/api
,这里用了前者更正确的表达,但是去年的毕业论文里面用的是后者,也能正常工作,似乎是因为我后端就没有对路径进行判断:)
Python
先安装openssl:
apt install build-essential checkinstall zlib1g-dev
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared
make install
然后打开/etc/ld.so.conf.d/openssl-1.1.1k.conf,并加入/usr/local/ssl/lib到文件中。ldconfig -v
可以看见已经有了新的libssl。
然后,替换binary:
mv /usr/bin/c_rehash /usr/bin/c_rehash.bak
mv /usr/bin/openssl /usr/bin/openssl.bak
修改PATH文件/etc/environment,加入/usr/local/ssl/bin,然后重新加载环境或者重启,即可生效。
接下来是Python,一定要先装依赖,否则会提示缺包,比如_ctypes。
apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libreadline-dev libffi-dev wget
./configure --enable-optimizations --with-openssl=/usr/local/ssl
make
make altinstall
今天先不编译了,这板子发热太大怕烧了,明天继续。明天顺便去小米之家买个小风扇吹一吹。
1月21日:现在遇到了个问题,就是装不上numpy,提示缺东西,但是现在这个不是主要问题了,暂时不管了
由于后续未必会用web的方式往外捅数据,也有可能会用c的库去读,暂时搁置。
参考:安装openssl:https://www.howtoforge.com/tutorial/how-to-install-openssl-from-source-on-linux/
安装Python:https://phoenixnap.com/kb/how-to-install-python-3-ubuntu
https://stackoverflow.com/questions/63084049/sslerrorcant-connect-to-https-url-because-the-ssl-module-is-not-available
改造数据接口
计划是利用原有的ADI驱动的ADC接口传输数据,不过原始的ADC接口是16bit*4的,而目前的想法是用128bit,其中32bit用来传其中的一路原始IQ信号[127:96],而剩下的48bit*2用来传处理后的IQ信号。
可能需要更改设备树的配置,具体在dma部分,WJZ猜测和adi,source-bus-width = <0x40>;
与adi,destination-bus-width = <0x40>;
有关
cf-ad9361-dds-core-lpc@43c04000 {
compatible = "adi,axi-ad9361-dds-6.00.a";
reg = <0x43c04000 0x10000>;
clocks = <0x0c 0x0d>;
clock-names = "sampl_clk";
dmas = <0x0d 0x00>;
dma-names = "tx";
};
dma@43c10000 {
compatible = "adi,axi-dmac-1.00.a";
reg = <0x43c10000 0x10000>;
#dma-cells = <0x01>;
interrupt-parent = <0x04>;
interrupts = <0x00 0x1f 0x04>;
clocks = <0x01 0x0f>;
linux,phandle = <0x0b>;
phandle = <0x0b>;
adi,channels {
#size-cells = <0x00>;
#address-cells = <0x01>;
dma-channel@0 {
reg = <0x00>;
adi,source-bus-width = <0x40>;
adi,source-bus-type = <0x02>;
adi,destination-bus-width = <0x40>;
adi,destination-bus-type = <0x00>;
};
};
};
dma@43c20000 {
compatible = "adi,axi-dmac-1.00.a";
reg = <0x43c20000 0x10000>;
#dma-cells = <0x01>;
interrupt-parent = <0x04>;
interrupts = <0x00 0x20 0x04>;
clocks = <0x01 0x0f>;
linux,phandle = <0x0d>;
phandle = <0x0d>;
adi,channels {
#size-cells = <0x00>;
#address-cells = <0x01>;
dma-channel@0 {
reg = <0x00>;
adi,source-bus-width = <0x40>;
adi,source-bus-type = <0x00>;
adi,destination-bus-width = <0x40>;
adi,destination-bus-type = <0x02>;
};
};
};
初步猜测这样会让/sys/bus/iio/devices/iio:device2/buffer/length_align_bytes
从当前的8变为16,也许能解决问题。(看起来0x40和8都对应目前的64位)
后来发现,iio\:device2对应的是DAC,应该改iio\:device3。
并没有解决,读取还是timeout,WJZ的判断是原本的IP核需要个sync信号,而这个信号目前是悬空的,看来并不能这样偷懒,明天想办法接上。
另外新的FPGA会不停报错zynq_remoteproc remoteproc@0: GIC IRQ 24 is not forwarded correctly
,查看/proc/interrupts
,能看见这个中断属于CPU1:
CPU0 CPU1
24: 0 44 GIC-0 91 Level remoteproc@0
根据GBW的观点,这是由于CPU1对应的程序还没启动,所以系统没法把FPGA产生的中断转发给CPU1导致的remoteproc驱动报错,应该对实际运行没有影响,因为在CPU1正常启动后,就不会再有报错了。GBW建议可以修改remoteproc的驱动把这个报错注释掉(不过反正ssh进去就收不到报错,影响应该也不算大,看不见报错就没有报错(确信))
1月24日:在linux源码的driver目录里面找到remoteproc的驱动,里面的这句error注释掉重新编译了内核,就能暂时屏蔽这句话。
然后还遇到了一个小问题,更新设备树之后没法NFS启动了,会卡死在DHCP和RARP上,网上的说法是在多个网卡的情况下,不指定NFS启动的网卡可能会导致这个问题。考虑到自动生成的设备树有的时候会莫名其妙多一个网卡,所以拜托了WJZ改一下设备树,问题解决。
参考:https://blog.csdn.net/qq_21435127/article/details/78914539
第二天了:接上信号后也没有反应,根据WJZ的建议这样测试了一下:
cd /sys/bus/iio/devices/iio:device2/scan_elements
echo 1 > out_voltage0_en
echo 1 > out_voltage1_en
echo 1 > out_voltage2_en
echo 1 > out_voltage3_en
cd /sys/bus/iio/devices/iio:device2/buffer
echo 8192 > length
echo 1 > enable
cat data_avaliable
这样是可以看到data_avaliable里面有65536个数据的,证明并不是完全不行。
但是另外一个问题是,length设定为8192,而length_align_bytes设置为16(原先为8),这样data_avaliable应该是131072,而现在这个数据,很难不让人认为length_align_bytes仍然是按照8处理的。
我的猜想是ADI本来就没打算让人魔改驱动,所以这些都是硬编码好的。
现在WJZ已经跑路回家了,我想了两个方案来测试,其实就是两种不同速度的倒车方案。
方案一
方案一是为了防止官方库文件写死了部分参数设置的,虽然可能性不大,但是我怀疑有可能是因为读出数据的格式原因导致osc超时。
计划是将通道宽度改回64,把接入的数据暂时改回原始IQ值,看看效果。
自定义IP:
需要修改端口的话,直接在打包IP的时候右键,选择从顶层.v导入就行。但是导入后要重新指定一下AXI总线、时钟复位等信号的连线。
如果打包之后Report IP Status不显示可更新的IP列表,可以尝试直接展开全部,一般就能正常显示。
RTL打包的模块似乎容易出现找不到源文件的问题,目前是直接删除老的然后新建一个。
把硬件导出到SDK后,按WJZ的文档,用原先已有的fsbl和uboot重新生成一个BOOT.BIN。
然后可能需要修改设备树,先尝试一下在原有的基础上修改。
dma-channel@0 {
reg = <0x00>;
adi,source-bus-width = <0x40>;
adi,source-bus-type = <0x02>;
adi,destination-bus-width = <0x40>;
adi,destination-bus-type = <0x00>;
};
然后准备启动。
参考:https://www.yuque.com/docs/share/08b7c5a9-7391-4ce6-aa19-57aad0740d52
方案二
方案二则更激进一点,如果方案一失败了,则将ADI样例的所有FIFO都加回,看看这次能不能读出数据。
1月23号:方案二也失败了,明天再试试把所有ADC方向的东西都加回来,顺便把设备树改了
如果有条件,试试看把NJUPHY的东西加到官方HDL里面。
曙光
第二天回来,先问了问WJZ,由于之前测试使用的是IIO Oscilloscope,我和WJZ都怀疑会不会是软件有一些特定的逻辑,导致了读不出数据。
因此,改用了libiio的iio_recvdev命令,结果报错Unable to refill buffer: Connection timed out (110)。
在网上搜索了这个报错之后,只找到了一个风马牛不相及的结果,用的完全不同的芯片和平台,不过ADI的工程师给的解答是“可能和中断有关”。在WJZ的建议下,检查了当前系统的中断表,结果发现DMA对应的中断号和期望中的中断号不一样,两个DMA的中断号应该分别是89和88,但是系统中记录的却是63和64,WJZ的判断是Xilinx SDK在生成设备树的时候把中断号搞反了(这是常见现象,目前原因不明),需要按照Block Design里面sys_concat_intc的接线重新修改设备树里面amba_pl部分两个DMA的中断。由于中断设定和ADI的demo一样,所以直接把官方设备树的中断号抄过来,就能正常读取了。
参考:https://wiki.analog.com/resources/tools-software/linux-software/libiio/iio_readdev
https://ez.analog.com/mems/f/q-a/88988/adis16488-on-raspberrypi-3-unable-to-refill-buffer-connection-timed-out
升级内核版本
这主要是为了配合OTA升级服务器的搭建。OTA服务器由于用了Ubuntu 22.04,导致编译老版本内核的时候会报错,现在尝试换成2021_R1
版本内核。
I encountered a few challenges when setting up the latest Python version on my Ubuntu 18.04 machine. As mentioned by Phil Lembo, I opted for the PPA deadsnakes method to avoid overwriting the system’s default Python. However, I also needed to ensure that my Python environment was correctly configured, especially since I didn’t want to disrupt any existing packages. After some trial and error, I found the installation of additional libraries through `pip` using the `–user` flag to be helpful in managing everything smoothly.
For anyone looking for more setup advice, I recently had success following a [guide to install Paper on Ubuntu 20.04](https://docs.vultr.com/install-paper-on-ubuntu-20-04) for some additional configurations. It gave me useful insights into server setups and managing dependencies.
I had some difficulty ensuring that both Python and Golang were properly installed on my system, and I had to check the version of both tools using the terminal commands mentioned in the guide. After installing them, I was able to successfully clone Mosint from GitHub and install the required Python packages.
For those who are running Rocky Linux 9, I had a smooth experience once I followed the [guide on how to install Docker on Rocky Linux 9](https://docs.vultr.com/how-to-upgrade-from-rocky-linux-8-to-rocky-linux-9) and set up my environment correctly. If you’re struggling with dependencies or setup issues, I definitely recommend checking that guide, as it helps clarify the installation process!
这篇文章真的帮了大忙!一开始我在 Ubuntu 上折腾 Python 3 的安装时,遇到了不少坑。感谢这份清晰的指南,特别是关于 Deadsnakes PPA 的提示,让我终于成功搭建好环境。步骤详细又容易上手,特别适合像我这种容易被命令行搞懵的人。
另外,如果有需要在 Ubuntu 24.04 上安装的朋友,可以看看这个[install python ubuntu](https://docs.vultr.com/how-to-install-python-and-pip-on-ubuntu-24-04)指南,也挺实用的。我个人觉得这类文章真的特别有价值,希望你们能继续分享!