Site Overlay

A New Journey

好像在一开始搭建这个博客的时候,我是打算写一个技术类的博客的,结果技术类的东西没写什么,倒是发了几篇随笔。当然了,客观条件是随笔本来有些积累的文章,而技术方面的东西一直以来积累不多,但是另一方面主观地讲,我也有点总觉得技术内容不好编排,不好写好,容易出纰漏,容易不成条理。
不过我又想,即使是如此,写下来也比不写好,即使是随便记录下的一点指南一点笔记,说不定也会在后面的开发中起到作用,或者得到进一步的完善。比如说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版本内核。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据