From 71f8e672d5ec431f817c45e7fce263c5e072a8d6 Mon Sep 17 00:00:00 2001 From: Miaow <3703781@qq.com> Date: Thu, 1 Sep 2022 21:40:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=BA=E5=99=A8=E5=B7=B2=E7=BB=8F=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E5=88=B0=E6=B7=AE=E5=AE=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 8月底出差告一段落,运行一切正常 1. 添加了喷阀数据队列走空计数和自动补偿功能 2. 喷阀数据队列发生不可恢复的异常时向上位机报告错误 3. 取消双FIFO --- doc/develop_and_deploy.md | 114 +++--- .../{2.png => system_arch.png} | Bin doc/hardware_description.md | 77 ++-- doc/pl_reference_mannual.assets/fifo_ecr.png | Bin 0 -> 12254 bytes doc/pl_reference_mannual.assets/fifo_regs.png | Bin 67345 -> 106008 bytes doc/pl_reference_mannual.assets/regs.xlsx | Bin 29242 -> 29673 bytes doc/pl_reference_mannual.md | 22 +- doc/version | 2 +- hardware/pl_platform/version | 2 +- protocol/version | 2 +- protocol/下位机和上位机通信协议.md | 6 +- source/linux_app/Makefile | 1 - source/linux_app/data_filter.c | 52 +++ source/linux_app/data_filter.h | 34 ++ source/linux_app/fifo_dev.c | 55 ++- source/linux_app/fifo_dev.h | 22 +- source/linux_app/host_computer.c | 129 +++++-- source/linux_app/host_computer.h | 13 +- source/linux_app/main.c | 86 +++-- source/linux_app/main.h | 0 source/linux_app/queue_uint64.c | 11 +- source/linux_app/version | 2 +- source/linux_driver/encoder.c | 333 +++++++++--------- source/linux_driver/fifo.c | 207 ++++++----- source/linux_driver/version | 2 +- source/petalinux_hwdescription/version | 2 +- 26 files changed, 760 insertions(+), 414 deletions(-) rename doc/hardware_description.assets/{2.png => system_arch.png} (100%) create mode 100644 doc/pl_reference_mannual.assets/fifo_ecr.png create mode 100644 source/linux_app/data_filter.c create mode 100644 source/linux_app/data_filter.h create mode 100644 source/linux_app/main.h diff --git a/doc/develop_and_deploy.md b/doc/develop_and_deploy.md index 785e93a..fbf7b8e 100644 --- a/doc/develop_and_deploy.md +++ b/doc/develop_and_deploy.md @@ -2,7 +2,7 @@ ## 开发 -本次开发基于zynq芯片,因此FPGA设计软件为Vitis中包含的[Vivado 2021.2](https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloadNav/vitis.html),Linux编译工具为[petalinux 2022.1](https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloadNav/embedded-design-tools.html),Linux应用程序编译工具为linaro的[arm-linux-gnueabihf-gcc 12.0.1](https://snapshots.linaro.org/gnu-toolchain/12.0-2022.02-1/arm-linux-gnueabihf/)。 +本次开发基于zynq xc7z010-1clg400芯片,因此FPGA设计软件为Vitis中包含的[Vivado 2021.2](https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloadNav/vitis.html),Linux编译工具为[petalinux 2022.1](https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloadNav/embedded-design-tools.html),Linux应用程序编译工具为linaro的[arm-linux-gnueabihf-gcc 12.0.1](https://snapshots.linaro.org/gnu-toolchain/12.0-2022.02-1/arm-linux-gnueabihf/)。 ### 生成硬件描述文件 @@ -19,19 +19,17 @@ $ petalinux-create -t modules --name encoder --enable ``` -2. 上传驱动代码[source/linux_driver/fifo.c](../source/linux_driver/fifo.c)和[source/linux_driver/encoder.c](../source/linux_driver/encoder.c) +2. 分别上传驱动代码[source/linux_driver/fifo.c](../source/linux_driver/fifo.c)和[source/linux_driver/encoder.c](../source/linux_driver/encoder.c)到下面的目录中 ```shell - $ cd ~/ps-linux/project-spec/meta-user/recipes-modules/fifo - $ rz # 上传source/linux_driver/fifo.c - $ cd ~/ps-linux/project-spec/meta-user/recipes-modules/encoder - $ rz # 上传source/linux_driver/encoder.c + ~/ps-linux/project-spec/meta-user/recipes-modules/fifo/files + ~/ps-linux/project-spec/meta-user/recipes-modules/encoder/files ``` - -3. 上传xsa文件并config + +3. 上传硬件描述文件[source/petalinux_hwdescription/system_wrapper.xsa](source/petalinux_hwdescription/system_wrapper.xsa)到`ps-linux`目录中并config ```shell - $ cd ~/ps-linux; rz # 上传source/petalinux_hwdescription/system_wrapper.xsa + system_wrapper.xsa上传到~/ps-linux $ petalinux-config --get-hw-description system_wrapper.xsa ``` @@ -71,7 +69,7 @@ ```shell $ cd ~/ps-linux/project-spec/meta-user/recipes-bsp/device-tree/files $ rm system-user.dtsi - $ rz # 上传source/petalinux_devicetree/system-user.dtsi + 上传source/petalinux_devicetree/system-user.dtsi ``` 5. 配置kernel,使用命令`petalinux-config -c kernel`,按下面提示或[source/petalinux_config/kernel.cfg](../source/petalinux_config/kernel.cfg)配置 @@ -188,38 +186,52 @@ # ├─imagefeature-hwcodecs (勾选为星号) # ├─imagefeature-package-management (勾选为星号) # modules - # ├─encoder (勾选为星号) - # └─fifo (勾选为星号) + # ├─encoder (不选) + # ├─fifo (不选) # PetaLinux RootFS Settings # ├─ADD_EXTRA_USERS (root:3703;petalinux:3703;) # ├─ADD_USERS_TO_GROUPS (petalinux:audio,video;) # └─ADD_USERS_TO_SUDOERS (petalinux) ``` -### 编译PETALINUX工程 +### 编译系统 1. 编译工程,使用命令`petalinux-build`。编译完成,在当前工程目录下生成images文件夹,该命令将生成设备树文件、FSBL文件、U-Boot文件,Linux Kernel文件和rootfs文件镜像 2. 制作BOOT.BIN启动文件,具体命令如下: ```shell - $ cd ~/petalinux-projects/ps-linux/images/linux/ # 生成的BOOT.BIN也在该路径下 + $ cd ~/ps-linux/images/linux/ # 生成的BOOT.BIN在该路径下 $ petalinux-package --boot --fsbl ./zynq_fsbl.elf --fpga ./system.bit --u-boot ./u-boot.elf --force ``` + + +### 编译驱动 + +依次运行如下命令,单独编译3个驱动程序 + +```shell +$ petalinux-build -c fifo +$ petalinux-build -c encoder +``` + +编译后的模块文件为` ps-linux/build/tmp/sysroots-components/zynq_generic/fifo/lib/modules/5.15.19-xilinx-v2022.1/extra/fifo.ko`和`ps-linux/build/tmp/sysroots-components/zynq_generic/encoder/lib/modules/5.15.19-xilinx-v2022.1/extra/encoder.ko` + +### 编译应用程序 + +在运行make时要设置好交叉编译工具链前缀,命令如下 +```shell +$ make CROSS_COMPILE=交叉编译工具链前缀 +例如 make CROSS_COMPILE=/home/miaow/software/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf- +``` + +编译后的可执行文件为工程目录的`build/target`,交叉编译工具链前缀也可以在Makefile中修改设定 ## 部署 -> 注意:这部分所需的文件按上一章节编译得到或者从github的release中下载 +有两种方式部署,一种是修改文件系统,这也是我第一次构建这个系统时的操作;另一种是直接写入镜像,推荐使用这种方式,省时省力不易出错 -### SSH连接 - -1. 电脑网卡设置到开发板同一网段 - -2. SSH连接信息如下 - - ```shell - $ sshpass -p "3703" ssh root@192.168.10.10 -p 22 - ``` +> 注意:修改文件系统方法所需的文件按上一章节编译得到或者从github的release中下载;直接写入镜像所需的文件在release中 ### 修改文件系统 @@ -267,31 +279,36 @@ $ reboot ``` -7. 安装编译得到的驱动文件fifo.ko和encode.ko,并设置自动加载,对应脚本见[script/loadfifo.sh](../script/loadfifo.sh)和[script/loadencoder.sh](../script/loadencoder.sh) + - ssh方式,root登录: +7. 电脑网卡设置到开发板同一网段 SSH连接信息如下 ```shell - $ cd ~; rz #上传fifo.ko - $ rz # 上传encoder.ko - $ mv fifo.ko encoder.ko /lib/modules/[内核版本]/kernel/drivers/ + 在电脑上执行下面命令 + $ sshpass -p "3703" ssh root@192.168.10.10 -p 22 + ``` + +8. 安装编译得到的驱动文件fifo.ko和encode.ko,并设置自动加载,对应自启脚本可以如下方式写入,也可以直接上传[script/loadfifo.sh](../script/loadfifo.sh)和[script/loadencoder.sh](../script/loadencoder.sh),ssh方式,root登录: + + ```shell + 上传fifo.ko、encoder.ko到/lib/modules/[内核版本]/kernel/drivers/ $ cd /lib/modules/[内核版本]; depmod $ set +H $ echo -e "#!/bin/sh\nmodprobe fifo" > /etc/init.d/loadfifo.sh $ echo -e "#!/bin/sh\nmodprobe encoder" > /etc/init.d/loadencoder.sh - $ chmod 755 /etc/init.d/loadfifo.sh - $ chmod 755 /etc/init.d/loadencoder.sh + $ chmod 755 /etc/init.d/loadfifo.sh /etc/init.d/loadencoder.sh $ cd /etc/rc5.d $ ln -s ../init.d/loadfifo.sh S20loadfifo.sh $ ln -s ../init.d/loadencoder.sh S20loadencoder.sh ``` -8. 安装编译得到的应用程序target,并设置自启动,对应脚本见[script/target.sh](../script/target.sh) +9. 安装编译得到的应用程序target,并设置自启动,对应脚本见[script/target.sh](../script/target.sh) ssh方式,root登录: ```shell - $ cd ~; rz # 上传target + 上传target到/home/root + $ cd ~ $ chmod 755 target $ set +H $ echo -e "#!/bin/sh\nif [ -x /home/root/target ]; then\n /home/root/target\nfi" > /etc/init.d/target.sh @@ -299,35 +316,36 @@ $ cd /etc/rc5.d $ ln -s ../init.d/target.sh S99target.sh ``` - -9. \[可选\] 设置.bashrc,美化PS1,对应脚本见[script/.profile](../script/.profile)和[script/.bashrc](../script/.bashrc) + +10. \[可选\] 设置.bashrc,修改PS1,对应脚本见[script/.profile](../script/.profile)和[script/.bashrc](../script/.bashrc) ```shell - $ cd ~; rz # 上传.bashrc - $ rz # 上传.profile + $ cd ~; rm .bashrc .profile + 上传.bashrc和.profile到/home/root $ if [ ! -a /home/petalinux/.profile ]; then cp /home/root/.profile /home/petalinux/ fi $ if [ ! -a /home/petalinux/.bashrc ]; then cp /home/root/.bashrc /home/petalinux/ & chown petalinux:petalinux -R /home/petalinux fi $ source ~/.profile ``` - -10. \[可选\] 安装ncurses-6.3和htop. + +11. \[可选\] 安装ncurses-6.3和htop ```shell $ cd ~; rz # 上传ncurses-6.3.tar.gz $ tar xmzf /home/root/ncurses-6.3.tar.gz -C /usr/ $ rz # 上传htop.tar.gz $ tar xmzf /home/root/htop.tar.gz -C /usr/ + $ echo "export TERMINFO=/usr/share/terminfo" >> /etc/profile + $ reboot ``` -### SD卡启动 +### 直接写入镜像 -1. 给SD卡创建DOS分区表,然后分2个区并创建文件系统,细节如下表: +强烈推荐的傻瓜式的方法,在windows上准备好正版[DiskGenius标准版或专业版](https://www.diskgenius.cn/),盗版有BUG,从release中下载sdimage.pmfx文件 - | 扇区 | 大小 | 分区类型 | 文件系统 | 卷标 | - | -------------- | -------------- | ----------------- | -------- | ------ | - | 2048~x扇区 | 100M | C W95 FAT32 (LBA) | FAT32 | boot | - | x扇区~最后扇区 | ≈SD卡大小-100M | 83 Linux | ext4 | rootfs | +1. 在windows上插入16G的TF卡 +2. 打开DiskGenius +3. 左侧栏选中TF卡,右键,从镜像文件还原磁盘 +4. 选sdimage.pmfx文件 +5. 点击开始 -2. 将Github Release中的BOOT.BIN、boot.scr和image.ub复制到boot分区;将rootfs.tar.gz解压到rootfs分区。 - -3. 拨码开关拨到SD卡启动,插入SD卡到XME0724底板上,上电启动。 +把TF卡插回板子,启动方式拨到SD卡启动,上电。要进入系统,参考修改文件系统章节的第7步。 diff --git a/doc/hardware_description.assets/2.png b/doc/hardware_description.assets/system_arch.png similarity index 100% rename from doc/hardware_description.assets/2.png rename to doc/hardware_description.assets/system_arch.png diff --git a/doc/hardware_description.md b/doc/hardware_description.md index 194354f..27f7a20 100644 --- a/doc/hardware_description.md +++ b/doc/hardware_description.md @@ -1,54 +1,77 @@ # 硬件平台 -PL端主要由4个外设组成,分别时**风扇控制器**(FAN),**编码和分频控制器**(ENCODER),**先入先出队列**(FIFO)和**阀板控制器**(VALVE)。其中阀板控制器没有提供AXI接口,因此并没有映射寄存器,软件也无法进行控制。各个控制器的连接关系如下图所示。 +PL端主要由4个外设组成,分别时**风扇控制器**(FAN),**编码和分频控制器**(ENCODER),**先入先出队列*(FIFO),阀板控制器**(VALVE)。其中阀板控制器没有提供AXI接口,因此并没有映射寄存器,软件也无法进行控制。各个控制器的连接关系如下图所示。 -![2](hardware_description.assets/2.png) +![2](hardware_description.assets/system_arch.png) -由于开发板的PL端没有自带晶振,所以4个外设由统一的同步时钟驱动,时钟源来自PS端,为200MHz,软件不可修改。外部编码器信号输入**编码和分频控制器**,控制器根据软件设置的阀触发分频值和相机触发分频值对编码器信号进行分频,分频后的信号用于驱动喷阀动作和触发相机拍照。为同步触发相机和移出队列以及保持队列中数据的动态平衡,**先入先出队列**在相机触发同时输出一个数据,即**先入先出队列**读信号和相机触发共用同一个信号。而由于电磁阀的物理特性导致电磁阀无法以触发相机的频率进行开关,因此**阀板控制器**对先入先出队列输出总线上的数据进行重采样,即按照**编码和分频控制器**输出的阀触发信号更新并转换为阀板协议,输出电磁阀的状态。设计的风扇控制器用于驱动风扇的启停,给ZYNQ芯片进行降温,防止芯片过热导致工作中出现问题。 +由于开发板的PL端没有自带晶振,所以4个外设由统一的同步时钟驱动,时钟源来自PS端,为200MHz,软件不可修改。外部编码器信号输入**编码和分频控制器**,控制器根据软件设置的阀触发分频值和相机触发分频值对编码器信号进行分频,分频后的信号用于驱动喷阀动作和触发相机拍照。光谱相机的触发频率较慢,为编码器频率/CDIV;彩色相机触发频率快,为⌊编码器频率/CDIV⌋\* 4。上位机发来的喷阀动作数据有两个,对应的分别是光谱和彩色相机的识别结果,都是为256宽度*1024高度。识别结果存储到**先入先出队列**中。 -## 生成硬件描述文件 +为同步触发相机和队列移出信号以及保持队列中数据的动态平衡,两个先入先出队列在彩色相机触发同时输出一个数据,即**先入先出队列**的读信号和彩色相机触发共用同一个信号。而由于电磁阀的物理特性导致电磁阀可能无法以触发相机的频率进行开关,因此**阀板控制器**对先入先出队列输出总线上的数据重采样,即按照**编码和分频控制器**输出的阀触发信号读入。两个先入先出队列移出的数据在**阀板控制器**中进行按位或运算,得到的数据转换为阀板协议,输出给阀板。**风扇控制器**用于驱动风扇的启停,给ZYNQ芯片进行降温,防止芯片过热导致工作中出现问题。由于风扇寿命短,因此目前采用散热片方案,风扇不开。 -1. 创建名为test_lower_machine的工程,打开**Block Design**,添加ZYNQ7 Processing System、ip_fifo、ip_encoder、ip_fan、valve_interfaces模块。 -2. 在ZYNQ7 Processing System中勾选Quad SPI Flash [1-6]、Ethernet 0 [16-27]、USB 0 [28-39]、SD 0 [40-45]、SD 1 [46-51]、UART 0 [14-15]、TTC 0 [EMIO]、GPIO MIO {Ethernet PHY Reset [7]、USB PHY Reset[8]} -3. 按顺序点击**Generate Outputs Product** -> **Create HDL Wrapper** -> **Generate Bitstream**,**File** -> **Export Export Hardware** ,得到xsa文件。 +## PS模块 +下面列出需要开启的外设和采用的IO口,BANK0为LVCMOS3.3V,BANK1为LVCOMS1.8V +| 外设 | IO | 备注 | +| --------------------------------------------------- | ---------------------- | -------------------------------------- | +| Quad SPI Flash | 1~6 | Single SS 4bit IO,Fast , ss_b pullup | +| Ethernet 0
MDIO | 16~27
52~53 | Fast, all pullup | +| USB0 | 28~39 | Fast, all pullup | +| SD0 | 40~45 | Fast, all pullup | +| SD1 | 46~51 | Fast, all pullup | +| UART0 | 14~15 | all pullup, baud 115200, 8bits, 1 stop | +| TTC0 | EMIO | | +| GPIO MIO
Ethernet PHY Reset
USB PHY Reset | 所有剩下的
7
8 | Fast, all pullup | + +时钟配置上,ARM为666.66MHz,DDR为533.33MHz,用IOPLL给PL端提供200MHz的FCLK_CLK0。 + +如果用的是7010的板子,内存选忽略下面这一段:内存配置上,选择DDR3,数据位宽32bit=16bit/chip \* 2chip, 4096Mbits/chip,频率533.33,速度等级为1066F,行/列/Bank地址宽度为15/10/3,CL=7,CWL=6,RCD=7,RP=7,RC=51ns,FAW=40ns + +ARM核上还开启AXI GP0接口与PL通信 ## ENCODER模块 -1. encoder模块自定义接口in_signal、out_signal_camera_posedge、out_signal_valve_posedge、out_signal_camera、out_signal_valve +encoder模块主要接口为in_signal、out_signal_camera_posedge、out_signal_camera_posedge_x4、out_signal_valve_posedge、out_signal_camera、out_signal_camera_x4、out_signal_valve -2. in_signal接口与外部编码器相连,接收外部编码器信号 +接口比较乱,这个模块内部逻辑也实现的不优雅,这得怪老倪动不动就改需求 -3. out_signal_camera为分频后的信号,用于驱动相机拍照 +1. in_signal接口与外部编码器相连,接收外部编码器信号 -4. out_signal_camera_posedge为out_signal_camera的上升沿,该信号输出给fifo模块的rd_en接口,用来驱动fifo模块将数据加载到AXI总线上 +2. out_signal_camera用于触发光谱相机拍照,可以认为光谱相机一次触发产生4行喷阀数据 -5. out_signal_valve_posedge为out_signal_valve的上升沿,该信号输出给valve_interfaces模块的valve_en信号,用于输出AXI总线上的数据,驱动喷阀动作 +3. out_signal_camera_x4则为out_signal_camera的4倍频率,触发彩色相机,彩色相机一次产生1行喷阀数据 -6. ENCODER模块寄存器说明见[doc/pl_reference_mannual.md](pl_reference_mannual.md)中的ENCODER控制器部分 +4. out_signal_camera_posedge_x4为out_signal_camera_x4的上升沿,控制FIFO的读出 - +5. out_signal_valve_posedge为out_signal_valve的上升沿,驱动**阀板控制器**动作 + + +ENCODER模块输入输出频率的详细计算方式和寄存器说明见[doc/pl_reference_mannual.md](pl_reference_mannual.md)中的ENCODER控制器部分 ## FIFO模块 -1. fifo模块自定义接口rd_en、dout[383:0]、empty、full、almost_full、almost_empty、data_count[11:0]、fifo_valid -2. rd_en接收out_signal_camera_posedge传来的信号,用来驱动fifo模块将数据加载到AXI总线上 -3. dout[383:0]为驱动喷阀动作的总数据,数据位宽为384bit -4. 当empty信号拉高时,表示fifo中数据已经为空,无法输出有效数据 -5. fifo模块寄存器说明见[doc/pl_reference_mannual.md](pl_reference_mannual.md)中的FIFO控制器部分 +FIFO模块的主要接口为rd_en、dout[383:0]、empty、full、almost_full、almost_empty、data_count[11:0]、fifo_valid + +1. rd_en接收ENCODER模块传来的信号,控制模块内部FIFO按ENCODER模块所需频率进行读取和输出 +2. dout[383:0]为FIFO中读出数据,数据位宽为384bit +3. empty信号为1表示fifo中数据已经为空,无法输出有效数据,但输出寄存器仍然保持上次输出的值 + +FIFO模块寄存器说明见[doc/pl_reference_mannual.md](pl_reference_mannual.md)中的FIFO控制器部分 ## FAN模块 -1. fan模块自定义接口fan用于控制风扇的启停 -2. fan模块寄存器说明见[doc/pl_reference_mannual.md](pl_reference_mannual.md)中的FAN控制器部分 +fan模块接口fan输出为PWM波形,连接到外部的风扇驱动电路。 -> Note:fan模块代码中设计了PWM调速功能,但由于硬件兼容问题导致,无法观察到调速现象。但正常的启停可以做到 +fan模块寄存器说明见[doc/pl_reference_mannual.md](pl_reference_mannual.md)中的FAN控制器部分 + +> Note:fan模块代码中设计了PWM调速功能,对于带程序的交流风扇,无法观察到调速现象。但正常的启停可以做到 ## VALVE_INTERFACES模块 -1. valve_interfaces模块自定义接口total_valve_data[383:0]、empty、valve_en、sclk[7:0]、sen[7:0]、sdata[7:0] -2. total_valve_data[383:0]接收fifo模块dout接口传输的数据,对其重采样后由sdata接口输出给各个阀板 -3. empty信号与fifo模块的empty信号相连。valve_interfaces模块检测到empty信号为高后,表示fifo中的数据被读空,此时将total_valve_data的384bit的数据全部置为0,然后输出给阀板 -4. valve_en信号拉高后将384bit的数据输出给阀板,更新喷阀状态。该信号不拉高时则不更新喷阀状态 -5. sclk[7:0]、sen[7:0]、sdata[7:0]为对应8块阀板的时钟信号线、使能信号线以及数据信号线 +VALVE_INTERFACES模块的主要接口为total_valve_data[383:0]、empty、valve_en、sclk[7:0]、sen[7:0]、sdata[7:0]。VALVE_INTERFACES会将total_valve_data_a和total_valve_data_b两路数据进行或运算,得到同为384位的单路数据。 + +1. total_valve_data接收FIFO模块中读出的数据。 + +2. empty信号与两个FIFO模块的empty信号相连。检测到任意一个empty信号为高时,无论输入数据如何,只按协议输出全关给阀板。 +3. valve_en信号上升沿将total_valve_data按协议发送给阀板 +4. sclk[7:0]、sen[7:0]、sdata[7:0]连接到外部差分芯片,为最多8块阀板的时钟信号线、使能信号线以及数据信号线 diff --git a/doc/pl_reference_mannual.assets/fifo_ecr.png b/doc/pl_reference_mannual.assets/fifo_ecr.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbf0060d193a5ab119a4fb349def9718af412cc GIT binary patch literal 12254 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 qpe)0#{P%ov&W7qg2~}sEva=(#4Wb-~2D~vQruW literal 67345 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

U8U1JcVuU|xMU(aj54y>|V`@`h zbk@*6L|nXqwqxh(Fg<;9+biODZFKT(Cv@yS(~VU2l##ExgYst9|N2N447Gqrj}aX& zh_5pYk#S;Y<1UGF4>$!AA$K*+br34bgvVl>0J5D%XlZ+jWmW?f{wr`E(&rEZkS%fG z`4mIuGVMs>gI+nf6<9Ursf3mk}0_jpIl zh35S6esCX0hFBGlOX#$PiR*2-hhl`33Icyi#$4j!`F*W$0?8GHf=LiLxuT^Bc|ZOI zcHNK)HQ;4PoGZ_fY24cAq7Kh5)4~lqMcp#PB;#r_H20qY>^uS!QmbffQ@*Zt7l7vf zSYj!G4_K8ouX)I;l4Aa4U8Wi!Du~V^Lts7b@TNY^W4KSN^9`WL+K4&^l znoxX}C5N9tn4U(3TSvy!{_=C_@hyV~JKa*-$TH^DI;tCV;L~Q!IN}L7L!*G*RNx-z zGhs=p@Lp}eGGnki_^P@t84s10e18IB$dh?p2YLo|_SsTTl$TG$__`XJB@9z40HlA$O@q#IqT31zlXD}_r zWYrOWkYy=;ZM6U28qd=;fi4XCEpsKhU^z9~ATOk`V->rH&HpuaySz zh%3N*Xe-a*1roV~>>Y0?KmPtBZ{tD*g zuHSaa_(-PO$O`xC3_w*kdRd0#MzZvu6%rwvl1l;q740_W}6p-ZHYCR@YtY*w@hz=?;DH!sy%TwL3cwgO+Rootb#0TQf(Ea zldHZ?TlsF8v%l8;?wS4+X@yGfku)`^+pF2VH=i{`xNG*B-2(t9Rr(W@-khMF@6)5{ z%)kHDjT&lnwe(;pyA7-cfnJu&`f6~~tqiBw!;9=%EQjWKkWB3xL>9BRtETjlzdJ3& zNSl9$YSex-QP!FTAl>o^(nI(LTJ%ik=^^>*#{*UAU@o_8eRNAt4-HG?<@)_(Yz}yC=4V;w(YUgwy>8{q?^9(9;`;^L^S{e zPNxEQqTem|)Yf9&?hOtfZ~JmkYfJ5b0|9(h_WLltm@I&+#}*GPm+^jPf#6j~tphER z$dpxeG{=ECh~YCBX`?5V@-~6kD)X1k@XsyVB5^JjM$yD5Ht5xGJ@PUNHsC^%XZSKF zs>Eh-&2kh`>warRm*p3cDUsY!bE@nDl{ zYrOMnp{6Gfp44d!qwlf{N-?S~R$9#|59e3zTs39dANG1#T@#O>Jy_FxHhF#0TE`h7 zw?L(V^&TPYt-IvLHSHEeJhKy? zPralSDB8o@UQ5CQ^PXkjJ`i=vvFvvNlwDfmDn#Sd&J>nM(|C_gwoXz4(6 zAd*7JBB`P0~ZXq21o54dF85RuO5n|2_DI6sH}b^5f}S>@%*icU+Kd$ zhJbv;n(HIcW~JncG!7=8UK=Hi---EnA5Wgn)s3 zui(gQOD}98Qg*IeJ3&co_m!l<^A{sQoPVg?98oV(E4kenaYVz}=)nO_a`( z*OhDF*knQpVK!T;M)hWkKaY_(vcEE3q4Vo}I%V=im{~sj`BlJW^O@(yz%h#Ch(Z3A zi;J`6A8hD#a|%q6;p&3Pskb26SuK_pF@%Du z==WuR`UKExhL+KkaD_V3Zb1-f;LF+Bj~_+s@0Cqi(g{NV@~y$t<0t# zT6$3IcBA{`-i8h_-&=oWLF((Y`fEHIpi@a)!G~u#p=`>kNo?{m&O(XVH1y%>);02+iJ?&s5&c ztFUiY2kN?XQ3xF^*v-7^KF4kyo3orfuLcqPB|CfOOmw^A5fd7|(|CfOO zRZs7Klz{8jo-;UW6xJ(Umii7@!6rq!RwOs#uz(r zeQmN3U!O*rbI7|O0jT_75&4^Vy2-VGe-HGD?OI`4D)rG7EP)qi5>2J*6 z(ei^HEZcli2NvGnpJ2z%LzEvCHk2RHwO%L0;vU(p4$nVzCmK4LY2^ zoZqF`QxEIrZNF@OhDs>a4*gsk1!+ms%{mO7!P|#8+_6Q*VXB&Mr1;|(vfcb^LOzhO zY+FfrS+b@p;~w2$anoKHeh`{de%e+vqO}K;?W#Ue{%ys}0<*ZOt8KUvF*_@bwl4IN zPJ!A2%E(pz!2_uiP`QXNa5Zg{HuA+$Z~5}{heR@kwczgapbeUtod;%oKmb>(zUm~A zkhdCi;O>QNayFKd-M!H*wi51MRsN4%0wQf&;Td@ZzL;m7DgHxgIH71642gmQEp3>4 zB+;_2U}%`UQ*`80D~q75&&Nq4f;~6u9)2fVaz(|8DG#_9Y^;Ye>8l;QvwXn|y&pEl6is>pv!1(JvXqLUNiQR3h_!iQZvj_)% z>wUGxZ(6OKbBoDVBIEFAscA6c7mGjGSf{kcRCla>>mvV$(||6%t+XQcgsibnb2)a5 zDrZ7*HXf9T6UMei;LT3@-qccB(sY|GNy4~U<1TRB257^T!!~dYh?ah*xd^%JxBxqS z9eGpmWXGMpt=Kw!BTh0UuO%jUe9Z;;K2j;gLks&16Q9HbzZl+U*yZKyey77E(Q2Q~ zc~fS&;cu1G(izIw&G!Z8DAvw>%NQlQ26}x7uIvhE#p!}pv z{bGe6x!yT=w*wqOw;?EP$#jpiRbT}y;nda;Nm$cTYTeevC$>aWcfEn8>(g~sSv-7M zJnD~!PEu^2JX#kweF@vVuQ!-~RmtawOe(0cyoKXBSxTRo^j20N6v(Hb+u)STOO(E@H{d%zA&ho-@X+F5Lf*%J)B()M zx!Jn(cb&F3ZU8>o;fa7e!FNtu%k&F@-6cG^7}+h^!0w?4XV4#gUT^H{zB{9f-_TVm z6@25RCo^J|d^)i8GTB%ASjT3tUo?BUt)qXViWGQz-@``Yh4B8#r<(a39~g!_ieYl} zy62u%Yd-7Zb1d1023@oMNW8#!;AO7u-(>+%nGZnaj{#OT^cR5o3`_)I1S6$i^xwE* z2_C!KZkzl*6Y%@nfiT}fPEzbrkq2lpMhePv#Z;Y$w6^zyv30dwH#ZnFD}x)}srtpw zYaQ<9{B@gEUQrB3-)|cNd3$lhAZ@&6+U7+@)#5p$%r&Eji3j;Tm$(TZwZtwCiHvwf z^9@iMkSzFEL#J)IX!vWT6f?T|dOWwd(fEyx(~GNtxg9n}zjgR)c0l&!c~|=}PgL7O zqP?@L2yg8v>L$X={*bJA2i@8X)W(cUHVVmzZt%K2)?ae#rjy9LrIR`yhb29nowV4G zYGc!XlX(BNf)#nd)<7x9 z{60q~UrHHlC3!+}m~CR?Bw0Je)nn~NEkg{nb@POR;)e0bhH{gEj}A`e`K}Z~a2{ zANv9RWAj7*aj5HDb@!fYSKd!A!C}$X;1jGo14HA}&O?gq5|Syw50CD*07hfaA{8Tf zoV1&3ri!vZv-I~r!!J&%M(qP7yl<2nmwzKUR+6|`o3ZDLH@Xq-_GcS$t_r{0e7iAE zKYiPJ4#UYv!lYx!`_eyQGEkNw`wy5raF%dyHN$<*@3+nbsMiv3a8uGQf@62lP?BXQ z>uks;)Gws__*9MLSmV{mU7rQ&g;92s!Jp2z0n51S$ zrJ8z=z5as`Ke-P$T~^C7%b}zQ4=HGe0Pps@d9Jn_^@2`ga66 zBVsQnCGlvhYc2Mcy>3wF_OXpU-J->0LwTQgf94EH)*r%%{P@lm~0jg{Gf$BOCg8b)Z z-$vV_W8j1#Ya;{PDE1Iejz50u2<3P}+!ZfKPK zNVXCy>@NiT)mQy*t;D4$6A3KetTV_O%&Z5Gs+EqOcd6#|qZSvR?%#<6hieA_4w6)M znnNWN5TFHJE7|_J0Nrj|90$K?#f0w-`4&=qqEWz=S)8zaO8w^CLsKLDOPrJ|E<{5w ztl-v*Ih&7fgWp&@wAADe%>m^3e|01cS;07_alV#iswj6|F#gsvlkIGkq5CU!BN~y$ z<5FS^Ot=J{si|vYAcJ*W3>I*i|10Kr%@z53EaQ)AUUh_gfgpr-Ou?9Q!OEBqx0;^0 z;(V^teE-DnlWJGly}Y$x+Xs`sRO+l;C>tGtUn)3oa1(6CG13J?_bT{)mxuqMm7?ah zGYulnmDfg{=(e1U%49i*?h%$yDCq+YnhxnUe1Lf)x1zL2fKIDqfj~Z)W#g2HeKG>~Y11|8O?VPp7?6%M? z;)ycsgu5}=b(-mp$c6Q!?FROya4dIhH(-*5+^U-CgmCO2joI_!Wyu6v9L?LH0T;yO zwX(C8D5JQ>)0el?EeJE~Om)YeDI_|!6V4W1rdSJUr79(d*Wq-F%Uk>ikLAR+UxACR zhB7vRH_)+VT8Nykiu2%Ev4@%DyRJ-~EB7|^WNVWFP^No!2+C*1n`4pFVWd3wl#M2L zL8w@$yr`DwGA2-2yMUTvt>@?gWbwG1p3vk$So%yNNn*$S*KkgvEOqKJss~Z@>WKl1 zvmKv&3z1vLF{N{xSo)P&msUqWZSwTVa!y#$3QG>ioi|ZdBrbNVqg>7JFUwZusbU!M ztEPp5_{T8!h05>S=RTK{Rt@0cX3GnsoQe=535rRhP0%>YNf;HeR8=>R)YhwzMiv|h{X? zUlIcqx7;ZgWEwfIFwoDF+u!W{!Z6a?*4YtwMo;+Rn9wdJ>TaCIy%;cxo{0M>Ruzm< z*cCXO&y!;>w8*|>#{kDHSz_j#9Ik0Td)s3k#p;c+K!$d_+VvPsWsZ3!MwcVRh0#VX zbcD^U5(0aHkq}q@y#*nNn$51)F^oFzb7N4WrUxps@CiU=4jOTa`{p|PHSloIUqM<% z4kYIIr~`>PkyHYYiSwi^9e%V?*smGXpH{b(^x$?BGu?Mo^y#pL$3xT<+YgQg9AMpP z#fN)_#!|&m8t#?&iN=Af?4F6(>-W9~`5f@B@bl$+Rb<{RRv+~%y-YUWCz3K_ae)>N&=Pe86h0EPdE^P*cIorOZ4P+ekJJ z9?=gba2S8n99!al~T$AZZv;NyAS2uG_ zL{HXBZY#`$as2be1D1Bh2#!2zgS?~%Bb4-5D{3cZ2M78so!f1FB`{TQS_mz(VXuCu zQi;kC@3nrkDri$?AlIYy6_=bJSqDZL0y^+;sS$E7E)P_0j=9s5H0Sp$bX;gujH~;i z_UN4re51_ad{IvE!T~bcZi+4*--NEHqrxy;XzR;%tQ2c**an+JDVj00@G2&$Z`2=DUMLo5LVf?HIj0Yqscrc;1BWo<{EdjOX+hgj zo<8GENi_+8ojRcbuv6<{;{iK$xYF9L;?2WR@fl&}>>rT>Zb?TE;B!6W8JDaRW23g1 zdoSu6dG=)?r8o4d40&tTmtxH_*96aac#76Re_wn4bc=&>dG1A)M6VY!tOED1b8!52 zHx;z!o+1ZG_Gr$7TdYh?_MV@xv!-G-tF$SBUJKgF<{qt&0+N3dSf8b+?4y9?fW85I zoOhrjde@AnRSs9J5Y294TTX?O3;-lsK$qUQjs3Rabm2gkzCyPeJ~VO8!F#Ly*d(eA zIDuXRitt*4(N2=H76`NVGhsxlca$SnXvZudg#6oIP|pEP`q_ad{UKnh4ZP}CQRgvB zv9|opcLY@L58S-=|1|ED_H6YR+C|sXM_)W)hU;jd!fgju)U?M*G4ua$@itcl64?%l z%xZzD71EA{F24D@H+)m^1(zr4QYLr@MSTeh0Y1Mqnfx^thl0J~&EJ_?>xBXDfTgJJ=m)(Ezes7hQg)o&PcRHl;cq953*V)zWn(zl*NXEeZ`B$sR|KM%j zAFYXp*MFULVNyE?@Q@ZnBMJ$x+ha`+iTL1^`f(>=$V6C#vaXp(X6np?#0r zgK4GZn1Bn!v|P476gpL2HkL}vV21Px=i%rXk$h908Yepzwm&~}-JfBXU=TyTOIw|g z@QPxOoc2`7rq%{7Y>ol9hdDF7%KZK)5io`S{wU{m0C@(^6p(%AcJk8ra13Gm`!3!$ z%~^%>%ziFv6|%RQALI`(ZeM9+ZAi;Qd+!zC%alB*aPI)v`U!wgZxe#D_WOTYdgAy+ zVyFujqF+r9Gn@1jpByj|tJoLQteLJI~feuiqza&kgjBjQ4i~X+5+_RXA zi?ZnKIkGu?3b`0i*b)&9jNa=AKES7Z^T`5mOZJa9BBsEkwL3vizDd26Yj4!BK7W1j zoW9pJuPRs@tDYX@xhKf~4cFtwJk~q0w_2bKv`+m_c6G{-a65yB7`TVKVr6=nr3>JO zu7C|%Vhs81Ynt1ffa~r*I;;;6dg%?2j%%aS?_eqv8OvP^Dvtj&_yuenKiUJ{AG?eD zKkR*XR1;alx2|hNan%JxL{X@_ZA4)upuBIO`3r8UPDWwBGN&6 z2@nA(p-M@B1j2VG!Mg6#&U4=Hea~_K@a#FpnL9Ig%J2T#jb(4t%JtyT&h#VYP5bXz zuN9yWg%d1U0G5{*NpmoqU8%hYoblZMvR$77r-Rx+1omgs{vm|4osoK4GWzzBwLFo~ zm;sb>!J*v9Ij-OE$NzPrFv6^DD{l zNO;fydRcw`0?TBO8>7M5P48JY5E(mXJ7(6L-j@GBhA?=Xr8_LAzC*5r6s2u#HJ3zdq9U>Qy|juf+Exs^A4vWTqJ}$7KPutOro0EES{00TbN}Dv#>?oOn$*TIu3uwl`&9 zh5lSJVt}yR=|B#iW!j z^;G?mlY0@|TQ_~2-B@-21d)Hguuuz|aQ6~t%J79mUxaxV{}L9vrZi;YGc&3|vB6@W zBiVn=YJ&hL^5q`$U=`rojhi;ynbJeC#uAx385fg?Oog_QRpuqR2^T#8%N0O`Hy zr4$=a1H{DxMRP_lGPfI-vW-5GLr2URbFI_ywe!vF3dZhe{jscrde84r_&8zvSrLd7 zrc;V%YWIdxrZ6N^7hYKI)kiiK9kn_P9a>DLlj}Qal!~|=wG>3kz)r@X59D8VeHS?u z-GA>Ac1JhayXpP@lv;HP2pkJ2m;fL!No`y+L>x+3jd=`)w5N91K)m;BC4_zr2@ zBZkmLeAzs^iN-hEr^x$@wWbo)w&<4IHLTye1{}ljl9@Le&J>J3P?W-=T3&x3|5AN7pa!)Bz;=VAr#h93eR^J;{B&U9^bU45Qay<8hE971uo#(hpO# zQWC~l#Gun9tF94VzY$cV1aK{H%VsvG>aq7>5L7*O0oIw2SWRfIt@R>dy)$w?mcp}y z= z@%(#qJYOdiY^G?vrRrQ6qC{7jSShTtdj@}pj78U5myR*Uw1Cz-ReBa)F1(?4zCxoA zK>lN@%Eyj#igQ@vI5ug`qypl2r|INl2Y7744Ptw-(}oT!*x|WyN!-kauNdCm_=#kZ_2 z!e=wzU;+;Fv`DixzaJ+8Z81AEnSn;TtN*A9R#&DIZkl^P^I@~^K}I`BDeeiB;wH`B zjOz<&X_&Q#=C3{>WcW#dkjpTr;wSDn>0}cj%5z~cAY{Up4VNZ;t6T>18hZ}gG=6}m zv^|qq(A^@|rSh;@RFTW!%W4qFIGSuavwUo(o3PcWrT;=Fyo)91$sEMLL(7KpgqiR` z-SHMlFL~6fnS81HJ0p45EFQetKRv32-63G72&2ncTfHQk3@L`7Wy(khqFd6JR0#=o zcZl*QMRnbnwQNjW$=Z`25?duB6-nRYbNQTl_?KJkcI7UYevN#I6e=v9Wf9wHZ8<%9 z`DCs8M%Gmr+8|Xmb<0aA#R>pcY1tzz*d&vW$7nqr>3x$j{k@KIaN)(x&PP4uhAd=Ia4v?fN*akbe=p{)`%(zSNspIK%GK1O`Q zN#~x2lf0MKx*mP9wLRXNJBjZu->hYKNrzJRJwJ_~0#^9a1{~y6ad6 z4Y`i9DX!z*t_ka1E)^g65urb5zX2sZWZD0J%{%~S5jAn?-B6M-XPxMGL`MnK0)WZR;2%2Ow5>dc~ktLqH?u717P8VI4TbM9t+b? zo*v0!zFg(hxM-1y&VO-F@P*61(igNW*=HoB&>;4dL`6YVlmb2o>2Omo;R}W+aTJ%P@p3wn;X zuQcEjm4YFk;_^16{srNi6SVIjuV#!g`pG9ZvP4y}=A>|2b=VV^^uPvdsdh+)?Yh~b zNqVoC=E2_~L^B4F8q||w2oJQ~&t(a3(Cz1|T7 zn`F~Y#_8)FB}%178kICtX?FW$Cy5$c)y6x)vPvCMJrJQ7@P$ycUGRO#U24RYR)<@D zcVp1MXUT1ME%wb|VD09Yp(}3D6mzm2&!7Sy$8^TneKA4Tx<)`hIeBZR|t5dcYwIa^ogj&1uKmGySYb(wv);vVjI=T1-* z1)tgD9b*YlT$Wfjk4u?%jv|X#QOOEwzdoE}@!H(Q-3;2(XI#KO0yp+SrH=g&JIfY3 ze+5II?8lZ_`$(DFKcr>|qi#7>Yi~qn706Pevjj!EIN=|xe=9pJB_xDIcEmjr%*uBW z3h&VwT!!G!#`T5V$ruBo**OJ>_-;oKVky$=dxkd}-bLu=AjIR__GUYTQEcJDAE!m4 zAYvEZ)>>_0*#AI>WV#sM8YR}M5En|uceom4%9Y=C%C6v@Rt{OTFK&c%INX;BQ7W z>Agi4)BiDV&Dd3*NC+RBA2TmJ-{rVz6U)(!nW~zKLFxPC?BD&BPuZqn;BY*9fXDD3 z2Po)OTuku=Sdh@@xm3)|K8?BDHqe^0l(qO!lC5jo7)}o-miKzJ0GMgbzf4M(u`IMM zV>C6w*>u*D1I`7qwK}K#_rbb7KzuUf#>c+Q8-4?+$IJXpqWnOHvlf)$+!i}2*~|Iz zKHTyE4R)IrGJx1#^@d-oMGvSOSSVK(#5vCen$&X7)u9n|#m|UG@>ef*#SW34xyn*f zoe@Zo>YSCbB#-fS*)kwJGR@wXjNM}WsOVR|VHgWS19vQAb8+VUFB1hk&c);YZwL$y zCt~lN;tPewbj`b3wh$3K^wd_SN}zb;K~~O@N1hYiuqMmoK;KKVSBm#!OPy&&2Mjcw zEqHwin$kX3pmnOl+NqO-Cy@hT`-!ZU9TIPvUc}0)0EUjrWV=_zuJMt>tJPwqPL`)h zMnzF*;}{+QiVyXmN}fb`?l-G3p$J)U%8go{i#M@uUe(z+nMUk_0DIHb(+D?GaXnT_vG~pp}3k4NPKZM|1Ep$bpe@* zNL1}Fe$>g`lD-Y}|5N{G>tdXAtz1VBrJwEz`PN_5w3SZBwxzBxF_ z$R$D3wPD9*ppMa?Dz-o6d4V7=kmm(Uf+3ad?p7!#qrEzo72`^?zALxgXp+S%fp0IK zocD7~Yr_@@lG0*MG95^hPA}Iq1?=j+^Mt1YZAC+`qwH{>95Ul1wpL1US?m{{ zRYo*|nkXHo`QJ~JPWL%AEAbkA-R=Jd%obheyLRhmu-DIEub;tQKZCt~27CQW3h;l| z)?E6Lyp^Fq^3n;&rU)?V07@tg@uHR(VaTzhG{u zi)tA=v>Y2HelTkt(>$oFwf~YjH6+Rz#dq)9KaW8suEX{6g`K`2dn zt~xoh@nDz(jbZET_D*xVTtBf1n>$p7$=$LVXUn#dmU^CBC1cbmEEWmXtys=Anov+Frf?!qj2CTXgZ|iA`>Y4dY zfX&(r^wFc#t>+D&rXZ8ZJ|C+nIY0%5X`2_`7qvZOU8Y2;J>vnpf^2pzB&a|54lxgO zTYb|`w7nq5xqmzQI@L$Kjm*pr3CC?l(qd($li>JOdu;8JM$88?)7m8v^~S#D2^JVQ zCNm;>Ix^r1RyGa1--G5_gM&8DDS2K-K7M>wUp&j&3!=5TQ6UsBHTKQ&YsxokkUlUZ$2|Hl2Pv#6sEDEw2MTKd$OI_7cPru~KU7|nZMSQe zKjVqcK6jcq(Z~+Sp70*yK#iGBPNKw2JE0$wpAp~82owZ)2$e@J!s6uQSWA2$pmA

8Uy(AA7tF#CLt%qbJrxEiigoY)2_DQgKo0mwS)7 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[xTk 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

UM80JOfWFS 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 **MOD**位置1时,由上位机软件写入,将该位信号作为触发信号 | -| 位1 **MOD** | 模式选择 (Mode)
0: 外部触发模式,外部触发编码器转动
1: 内部触发模式,上位机软件模拟触发信号 | -| 位0 **CLR** | 清除缓存 (Clear)
0: 正常工作 1: 清除编码和分频控制器内部的分频计数值,不影响VDIV和CDIV
注意: 程序置位该位后后需再写入0,使计数器退出清零状态,正常工作 | +| 位2 **VTS** | 内部触发信号 (Virtual Triggle Signal)
**MOD**位置1时,由软件写入,将该位信号直接充当触发信号
0: 低电平
1: 高电平 | +| 位1 **MOD** | 模式选择 (Mode)
0: 外部触发模式,外部触发编码器转动
1: 内部触发模式,软件模拟触发信号 | +| 位0 **CLR** | 清除缓存 (Clear)
0: 正常工作
1: 清除编码和分频控制器内部的分频计数值,不影响VDIV和CDIV
注意: 程序置位该位后后需再写入0,使计数器退出清零状态,正常工作 | #### ENCODER阀触发分频寄存器 (ENCODER_VDIVR) @@ -117,7 +117,7 @@ ENCODER模块的寄存器主要有控制寄存器 (ENCODER_CR)、阀触发分频 | **Field** | **Description** | | :-------------- | :----------------------------------------------------------- | -| 位31:0 **VDIV** | 阀触发分频值
写入数据后编码和分频控制器自动清除缓存并应用新的数值
注意:0表示不间断触发,即PL端每个时钟周期均触发阀模块 | +| 位31:0 **VDIV** | 阀触发分频值
阀控制器重采样频率和编码器脉冲的分频值, 写入数据后编码和分频控制器自动清除缓存并应用新的数值
注意:0表示不间断触发,即PL端每个时钟周期均触发阀模块 | #### ENCODER相机触发分频寄存器 (ENCODER_CDIVR) @@ -194,6 +194,18 @@ FIFO的写宽度为384bit,因此需12个32位寄存器**FIFO_DAT0**-**FIFO_DAT | 位12 **FU** | 队列满标志 (Almost Full)
0: 队列中的有效数据小于FIFO数据深度
1: 队列中的有效数据达到FIFO数据深度 | | 位11:0 **CNT** | 队列数据数量 (Data Count)
该值指示队列中的数据数量
注意:一个数据为384位宽 | +#### FIFO空计数寄存器 (FIFO_ECR) + +队列为空后被读的次数 + +偏移地址: 0x34
复位值: 0x0000 0000 + +![image-20220613212701816](pl_reference_mannual.assets/fifo_ecr.png) + +| **Field** | **Description** | +| :------------- | :----------------------------------------------------------- | +| 位31:0 **CNT** | 队列为空读次数 (Empty Count)
该值指示队列为空后被读的次数
注意:改寄存器只读,仅在FIFO复位时自动清零 | + #### FIFO控制寄存器 (FIFO_CR) 偏移地址: 0x38
复位值: 0x0000 00xx @@ -210,4 +222,4 @@ FIFO的写宽度为384bit,因此需12个32位寄存器**FIFO_DAT0**-**FIFO_DAT FIFO寄存器可映射为32位可寻址寄存器,如下表所述: -image-20220613220214064 + diff --git a/doc/version b/doc/version index 9f8e9b6..ea710ab 100644 --- a/doc/version +++ b/doc/version @@ -1 +1 @@ -1.0 \ No newline at end of file +1.2 \ No newline at end of file diff --git a/hardware/pl_platform/version b/hardware/pl_platform/version index 9f8e9b6..b123147 100644 --- a/hardware/pl_platform/version +++ b/hardware/pl_platform/version @@ -1 +1 @@ -1.0 \ No newline at end of file +1.1 \ No newline at end of file diff --git a/protocol/version b/protocol/version index ea710ab..a58941b 100644 --- a/protocol/version +++ b/protocol/version @@ -1 +1 @@ -1.2 \ No newline at end of file +1.3 \ No newline at end of file diff --git a/protocol/下位机和上位机通信协议.md b/protocol/下位机和上位机通信协议.md index e9c7b0a..fe28de7 100644 --- a/protocol/下位机和上位机通信协议.md +++ b/protocol/下位机和上位机通信协议.md @@ -1,4 +1,4 @@ -# 下位机和上位机通信协议 V1.2 +# 下位机和上位机通信协议 V1.3 | 起始 | 长度高 | 长度低 | 类型高 | 类型低 | 数据字节1 | ... | 数据字节n | 校验低 | 校验高 | 结束 | | ---- | ------ | ------ | ------ | ------ | --------- | ---- | --------- | ------ | ------ | ---- | @@ -18,13 +18,11 @@ - 设置相机触发周期对应的脉冲数sc,**长度**10,数据为十进制字符串,'0''0''0''0''0''0''5''0'表示值50,'5'在前,'0'在后 - 设置阀板动作对应的脉冲数sv,**长度**10,数据为十进制字符串,'0''0''0''0''0''0''5''0'表示值50,'5'在前,'0'在后 - 设置相机触发到阀板动作的延迟脉冲数sa,**长度**10,数据为十进制字符串,'0''0''0''0''0''0''5''0'表示值50,'5'在前,'0'在后 - - 设置相机触发到阀板动作的延迟脉冲数sb,**长度**10,数据为十进制字符串,'0''0''0''0''0''0''5''0'表示值50,'5'在前,'0'在后 - 数据命令da, **长度**为视需求而定,数据要有(**长度**-2)个字节 - - 数据命令db, **长度**为视需求而定,数据要有(**长度**-2)个字节 - 数据 - 数据就是阀数据,其实这是一个命令,也就是数据命令'da''db',分到数据这一节写是因为它的参数格式和其他命令不同,下表为字节排序,接收时从右往左,也就是数据字节1先接收到,然后是数据字节2,最后是数据字节(m-1)。 + 数据就是阀数据,其实这是一个命令,也就是数据命令'da',分到数据这一节写是因为它的参数格式和其他命令不同,下表为字节排序,接收时从右往左,也就是数据字节1先接收到,然后是数据字节2,最后是数据字节(m-1)。 阀1代表面向各块阀板,最靠近右边的阀,所以最左边的为阀n diff --git a/source/linux_app/Makefile b/source/linux_app/Makefile index 71c2af5..ec46912 100644 --- a/source/linux_app/Makefile +++ b/source/linux_app/Makefile @@ -1,4 +1,3 @@ -#makefile for file_ioctl CROSS_COMPILE ?= /home/miaow/software/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf- TARGET := target BUILD_DIR := build diff --git a/source/linux_app/data_filter.c b/source/linux_app/data_filter.c new file mode 100644 index 0000000..fff8bb2 --- /dev/null +++ b/source/linux_app/data_filter.c @@ -0,0 +1,52 @@ +/** + * @file data_filter.c + * @brief Manage the hardware encoder unit + * @author miaow (3703781@qq.com) + * @version 1.0 + * @date 2022/08/06 + * + * @copyright Copyright (c) 2022 miaow + * + * @par Changelog: + * + *
Date Version Author Description + *
2022/08/06 1.0 Miaow Write this module + *
+ */ + +#include +#include +#include + +void datafilter_init(datafilter_typedef *filter, int w_size) +{ + filter->cache = (int *)malloc(sizeof(int) * (w_size + 1)); + memset(filter->cache, 0, sizeof(int) * (w_size + 1)); + + filter->w_size = w_size; + filter->sum = 0; + filter->head = 0; +} + +int datafilter_calculate(datafilter_typedef *filter, int z) +{ + filter->cache[filter->head] = z; + filter->head = (filter->head + 1) % (filter->w_size + 1); + filter->sum = filter->sum + z - filter->cache[filter->head]; + if (filter->w_size != 0) + return filter->sum / filter->w_size; + else + return -1; +} + +void datafilter_deinit(datafilter_typedef *filter) +{ + if (filter->cache != NULL) + { + free(filter->cache); + filter->cache = NULL; + } + filter->sum = 0; + filter->w_size = 0; + filter->head = 0; +} diff --git a/source/linux_app/data_filter.h b/source/linux_app/data_filter.h new file mode 100644 index 0000000..b2e8c8c --- /dev/null +++ b/source/linux_app/data_filter.h @@ -0,0 +1,34 @@ +/** + * @file data_filter.h + * @brief Manage the hardware encoder unit + * @author miaow (3703781@qq.com) + * @version 1.0 + * @date 2022/08/06 + * + * @copyright Copyright (c) 2022 miaow + * + * @par Changelog: + * + *
Date Version Author Description + *
2022/08/06 1.0 Miaow Write this module + *
+ */ +#ifndef __DATA_FILTER_H +#define __DATA_FILTER_H + +typedef struct +{ + int w_size; + int head; + int sum; + int *cache; +} datafilter_typedef; + +void datafilter_init(datafilter_typedef *filter, int w_size); + +int datafilter_calculate(datafilter_typedef *filter, int z); + +void datafilter_deinit(datafilter_typedef *filter); + + +#endif diff --git a/source/linux_app/fifo_dev.c b/source/linux_app/fifo_dev.c index 9bb04f4..ebcc0be 100644 --- a/source/linux_app/fifo_dev.c +++ b/source/linux_app/fifo_dev.c @@ -1,12 +1,21 @@ /** * @file fifo_dev.c * @brief Operate the hardware fifo with Linux application - * @details Call fifo_dev_init() paired with fifo_dev_deinit() as their names imply, fifo_dev_write() can be executed several times to operate the hardware fifo between fifo_dev_init() and fifo_dev_deinit() + * @details Call fifo_dev_init() paired with fifo_dev_deinit() as their names imply, fifo_dev_write_xxx() can be executed several times to operate the hardware fifo between fifo_dev_init() and fifo_dev_deinit() * @mainpage github.com/NanjingForestryUniversity - * @author miaow - * @email 3703781@qq.com - * @version 1.0 - * @date 2022/06/09 + * @author miaow (3703781@qq.com) + * @version 1.1 + * @date 2022/08/07 + * @mainpage github.com/NanjingForestryUniversity + * + * @copyright Copyright (c) 2022 miaow + * + * @par Changelog: + * + *
Date Version Author Description + *
2022/06/09 1.0 miaow Write this file + *
2022/08/07 1.1 miaow Add ignore_row_num to fifo_dev_write_frame + *
*/ #include @@ -14,13 +23,15 @@ #include #include #include +#include #include #include #include +#include #define FIFO_CMD_FUNCTION_CLEAR 1 #define FIFO_CMD_FUNCTION_PADDING 2 - +#define FIFO_CMD_GET_EMPTYCOUNT 3 static int fifo_dev_fd = -1; static char perror_buffer[128]; @@ -37,15 +48,34 @@ int fifo_dev_init() return 0; } +/** + * @brief Get the count of read operation when the fifo is empty. + * @note The empty read count will be set to zero at fifo_dev_clear() only. + * @return >=0 - success, other - error + */ +int fifo_dev_get_emptycount() +{ + int count; + int res = ioctl(fifo_dev_fd, _IOR('D', FIFO_CMD_GET_EMPTYCOUNT, 0), &count); + + ON_ERROR_RET(res, "", "", -1); + return count; +} + /** * @brief Set value to put of a frame. - * @param valve_data An array 32bytes * 600rows. + * @param valve_data An array HOST_COMPUTER_PICTURE_COLUMN_BYTES bytes * HOST_COMPUTER_PICTURE_ROW_NUM rows. + * @param ignore_row_num Remove the ignore_row_num rows at the beginning of the frame. range: [0, HOST_COMPUTER_PICTURE_BYTES) * @return 0 - success, other - error */ -int fifo_dev_write_frame(void *valve_data) +int fifo_dev_write_frame(void *valve_data, int ignore_row_num) { - ssize_t size = write(fifo_dev_fd, valve_data, 32 * 600); - int res = -(size < 32 * 600); + ssize_t size; + char *valve_to_write = (char *)valve_data + ignore_row_num * HOST_COMPUTER_PICTURE_COLUMN_BYTES; + int size_to_write = HOST_COMPUTER_PICTURE_COLUMN_BYTES * (HOST_COMPUTER_PICTURE_ROW_NUM - ignore_row_num); + + size = write(fifo_dev_fd, valve_to_write, size_to_write); + int res = -(size < size_to_write); ON_ERROR_RET(res, "size=", "", -1); return 0; @@ -71,7 +101,6 @@ int fifo_dev_write_row(void *valve_data) int fifo_dev_clear() { int res = ioctl(fifo_dev_fd, _IOW('D', FIFO_CMD_FUNCTION_CLEAR, 0)); - ON_ERROR_RET(res, "", "", -1); return 0; } @@ -84,7 +113,7 @@ int fifo_dev_clear() */ int fifo_dev_write_delay(uint32_t count) { - int res = ioctl(fifo_dev_fd, _IOW('D', FIFO_CMD_FUNCTION_CLEAR, 0), count); + int res = ioctl(fifo_dev_fd, _IOW('D', FIFO_CMD_FUNCTION_PADDING, 0), count); ON_ERROR_RET(res, "", "", -1); return 0; @@ -93,7 +122,7 @@ int fifo_dev_write_delay(uint32_t count) /** * @brief Get the count of items in the hardware fifo. * @note An item from hardware fifo is of 256 bits in size, aka. 32 bytes, 8 integers - * @return 0 - success, other - error + * @return >=0 - success, other - error */ int fifo_dev_get_count() { diff --git a/source/linux_app/fifo_dev.h b/source/linux_app/fifo_dev.h index ba230fd..8b0fbbd 100644 --- a/source/linux_app/fifo_dev.h +++ b/source/linux_app/fifo_dev.h @@ -1,12 +1,21 @@ /** * @file fifo_dev.h * @brief Operate the hardware fifo with Linux application - * @details Call fifo_dev_init() paired with fifo_dev_deinit() as their names imply, fifo_dev_write() can be executed several times to operate the hardware fifo between fifo_dev_init() and fifo_dev_deinit() + * @details Call fifo_dev_init() paired with fifo_dev_deinit() as their names imply, fifo_dev_write_xxx() can be executed several times to operate the hardware fifo between fifo_dev_init() and fifo_dev_deinit() * @mainpage github.com/NanjingForestryUniversity - * @author miaow - * @email 3703781@qq.com - * @version 1.0 - * @date 2022/06/09 + * @author miaow (3703781@qq.com) + * @version 1.1 + * @date 2022/08/07 + * @mainpage github.com/NanjingForestryUniversity + * + * @copyright Copyright (c) 2022 miaow + * + * @par Changelog: + * + *
Date Version Author Description + *
2022/06/09 1.0 miaow Write this file + *
2022/08/07 1.1 miaow Add ignore_row_num to fifo_dev_write_frame + *
*/ #ifndef __FIFO_DEV_H #define __FIFO_DEV_H @@ -16,7 +25,8 @@ #define FIFO_DEV_PATH "/dev/fifo" int fifo_dev_init(void); -int fifo_dev_write_frame(void *valve_data); +int fifo_dev_get_emptycount(void); +int fifo_dev_write_frame(void *valve_data, int ignore_row_num); int fifo_dev_clear(void); int fifo_dev_write_delay(uint32_t count); int fifo_dev_write_row(void *valve_data); diff --git a/source/linux_app/host_computer.c b/source/linux_app/host_computer.c index 41c0a51..8edaa0c 100644 --- a/source/linux_app/host_computer.c +++ b/source/linux_app/host_computer.c @@ -2,16 +2,17 @@ * @file host_computer.c * @brief Commnunicate with host computer. Protocal is described in hostcomputer通信协议.md * @author miaow (3703781@qq.com) - * @version 1.0 - * @date 2022/01/16 + * @version 1.1 + * @date 2022/08/06 * @mainpage github.com/NanjingForestryUniversity - * + * * @copyright Copyright (c) 2022 miaow - * + * * @par Changelog: * *
Date Version Author Description *
2022/01/16 1.0 miaow Write this file + *
2022/08/06 1.1 miaow Add fifob *
*/ #include @@ -27,9 +28,7 @@ #include #include #include - -#define HOST_COMPUTER_PICTURE_COLUMN_BYTES (HOST_COMPUTER_PICTURE_COLUMN_NUM / 8) -#define HOST_COMPUTER_RAW_DATA_BYTES (HOST_COMPUTER_PICTURE_COLUMN_BYTES * HOST_COMPUTER_PICTURE_ROW_NUM) +#include static char perror_buffer[128]; /** @@ -51,7 +50,7 @@ void *loop_thread_func(void *param); * @brief Pre initialize host computer module * @param data_q A pointer to the queue storing the valve data from host computer * @param cmd_q A pointer to the queue storing the cmd from host computer - * @return 0 - success + * @return 0 - success */ int hostcomputer_init(queue_uint64_msg_t *cmd_q) { @@ -63,6 +62,12 @@ int hostcomputer_init(queue_uint64_msg_t *cmd_q) return 0; } +static void send_error(int fd) +{ + write(fd, "error", 5); + printf("\r\nerror sent\r\n"); +} + /** * @brief Receive `size` bytes from a socket. If no more bytes are available at the socket, this function return -1 when timeout reaches. * @param fd The socket fd @@ -111,13 +116,18 @@ static int is_connected(int sock_fd) */ void *loop_thread_func(void *param) { - printf("loop thread in %s start\r\n", __FILE__); - int need_exit = 0; + // printf("loop thread in %s start\r\n", __FILE__); + int need_exit = 0, frame_count = 0, error_sent = 0; + int std_count, empty_packets_num = 0; + int empty_count_initial = 0; + int empty_count_processed = 0; char pre; uint16_t n_bytes; char type[2]; - char data[HOST_COMPUTER_RAW_DATA_BYTES + 1]; + char data[HOST_COMPUTER_PICTURE_BYTES + 1]; char check[2]; + datafilter_typedef datafilter; + while (!need_exit) { pthread_mutex_lock(&_global_structure.loop_thread_mutex); @@ -169,10 +179,10 @@ void *loop_thread_func(void *param) continue; } n_bytes = ntohs(n_bytes); - if (n_bytes != HOST_COMPUTER_RAW_DATA_BYTES + 2 && n_bytes > 10) + if (n_bytes != HOST_COMPUTER_PICTURE_BYTES + 2 && n_bytes > 10) { // close(_global_structure.socket_fd); - printf("n_bytes> 10 and n_bytes!=HOST_COMPUTER_RAW_DATA_BYTES + 2\r\n"); + printf("n_bytes> 10 and n_bytes!=HOST_COMPUTER_PICTURE_BYTES + 2\r\n"); continue; } if (recvn(_global_structure.socket_fd, (char *)type, 2) != 2) @@ -212,17 +222,94 @@ void *loop_thread_func(void *param) // commands are reformed as an uint64_t, 0x--------xxxxxxxx, where `-` refers its paramter and `x` is HOSTCOMPUTER_CMD if (type[0] == 'd' && type[1] == 'a') { - // printf("%dbytes of data put to data queue\r\n", (int)n_bytes - 2); - if (n_bytes - 2 != HOST_COMPUTER_RAW_DATA_BYTES) + /* + int current_count = fifo_dev_get_count(); + int current_count_filtered = datafilter_calculate(&datafilter_a, current_count); + + if (++frame_count_a > HOST_COMPUTER_BEGINNING_PICTURES_IGNORE_NUM) { - printf("n_bytes-2!=%d\r\n", HOST_COMPUTER_RAW_DATA_BYTES); + fifo_dev_write_frame(data, 0); + } + int added_count = fifo_dev_get_count(); + printf("before %d->after %d, diff %d, filter %d\r\n", current_count, added_count, added_count - current_count, current_count_filtered); + */ + //================================================= + + int current_count, current_count_filtered, diff_count, empty_count_to_process; + if (n_bytes - 2 != HOST_COMPUTER_PICTURE_BYTES) + { + printf("n_bytes-2!=%d\r\n", HOST_COMPUTER_PICTURE_BYTES); continue; } - fifo_dev_write_frame(data); + // get the item counts and its slide average value + current_count = fifo_dev_get_count(); + current_count_filtered = datafilter_calculate(&datafilter, current_count); + frame_count++; + if (frame_count == HOST_COMPUTER_PICTURES_BEGINNING_IGNORE_NUM + 1) + { + empty_count_initial = fifo_dev_get_emptycount(); + } + else if (frame_count == 100) // record the normal item counts in fifo + { + std_count = current_count_filtered; + } + if (frame_count > HOST_COMPUTER_PICTURES_BEGINNING_IGNORE_NUM) + { + // do nothing at first two frames, because that the first frame is set to zero and was concatenated to the delay frame before + // in case of late arrival of the first two frames. + empty_count_to_process = fifo_dev_get_emptycount() - empty_count_initial - empty_count_processed; + if (empty_count_to_process >= HOST_COMPUTER_PICTURE_ROW_NUM) + { + empty_count_processed += HOST_COMPUTER_PICTURE_ROW_NUM; + } + else + { + fifo_dev_write_frame(data, empty_count_to_process); + empty_count_processed += empty_count_to_process; + } + } + if (current_count == 0) + empty_packets_num++; + else + empty_packets_num = 0; + + + // print fifo status + printf("a ||| %d | cnt %d | avgcnt %d | stdcnt %d", + frame_count, current_count, current_count_filtered, std_count); + fflush(stdout); + // if (empty_count_to_process) + printf(" ||| initemp %d | toprc %d | prcd %d\r\n", empty_count_initial, + empty_count_to_process, empty_count_processed); + // else + // printf("\r\n"); + // if the item counts changes a lot compared with normal counts, + // meaning something goes wrong, a message will send to the hostcomputer + diff_count = current_count_filtered - std_count; + int diff_cond = diff_count > 250 || diff_count < -250; + int frame_count_cond = frame_count > 100; + int empty_packets_cond = empty_packets_num >= 5; + + if (((frame_count_cond && diff_cond) || empty_packets_cond) && !error_sent) + { + error_sent = 1; + printf("\r\na ||| avgcnt %d | %d larger", current_count_filtered, diff_count); + fflush(stdout); + send_error(_global_structure.socket_fd); + } } else if (type[0] == 's' && type[1] == 't') { // printf("Start put to cmd queue, param:%d\r\n", (int)atoll(data)); + frame_count = 0; + error_sent = 0; + empty_packets_num = 0; + std_count = 0; + datafilter_deinit(&datafilter); + datafilter_init(&datafilter, 20); + empty_count_processed = 0; + empty_count_initial = 0; + queue_uint64_put(_global_structure.cmd_q, (atoll(data) << 32) | HOSTCOMPUTER_CMD_START); } else if (type[0] == 's' && type[1] == 'p') @@ -255,15 +342,11 @@ void *loop_thread_func(void *param) // printf("Set valve pulse count put to cmd queue, param:%d\r\n", (int)atoll(data)); queue_uint64_put(_global_structure.cmd_q, (atoll(data) << 32) | HOSTCOMPUTER_CMD_SETVALVETRIGPULSECOUNT); } - else if (type[0] == 's' && type[1] == 'd') + else if ((type[0] == 's' && type[1] == 'd')) { // printf("Set camera to valve pulse count put to cmd queue, param:%d\r\n", (int)atoll(data)); queue_uint64_put(_global_structure.cmd_q, (atoll(data) << 32) | HOSTCOMPUTER_CMD_SETCAMERATOVALVEPULSECOUNT); } - else - { - printf("Unknown command received"); - } } printf("loop thread in %s exit\r\n", __FILE__); return NULL; @@ -271,7 +354,7 @@ void *loop_thread_func(void *param) /** * @brief Deinitialize and release resources used by host computer module - * @return int + * @return int */ int hostcomputer_deinit() { diff --git a/source/linux_app/host_computer.h b/source/linux_app/host_computer.h index a523222..00cabf0 100644 --- a/source/linux_app/host_computer.h +++ b/source/linux_app/host_computer.h @@ -2,8 +2,8 @@ * @file host_computer.h * @brief Commnunicate with host computer. Protocal is described in hostcomputer通信协议.md * @author miaow (3703781@qq.com) - * @version 1.0 - * @date 2022/01/16 + * @version 1.1 + * @date 2022/08/6 * * @copyright Copyright (c) 2022 miaow * @@ -11,6 +11,7 @@ * *
Date Version Author Description *
2022/01/16 1.0 miaow Write this file + *
2022/08/06 1.1 miaow Add fifob *
*/ #ifndef __HOST_COMPUTER_H @@ -22,11 +23,14 @@ #define HOST_COMPUTER_IP "192.168.10.8" #define HOST_COMPUTER_PORT 13452 -#define HOST_COMPUTER_PICTURE_ROW_NUM 600 +#define HOST_COMPUTER_PICTURE_ROW_NUM 1024 #define HOST_COMPUTER_PICTURE_COLUMN_NUM 256 +#define HOST_COMPUTER_PICTURE_COLUMN_BYTES (HOST_COMPUTER_PICTURE_COLUMN_NUM / 8) +#define HOST_COMPUTER_PICTURE_BYTES (HOST_COMPUTER_PICTURE_COLUMN_BYTES * HOST_COMPUTER_PICTURE_ROW_NUM) +#define HOST_COMPUTER_PICTURES_BEGINNING_IGNORE_NUM 1 /** - * @brief The commonds, ref hostcomputer通信协议 v1.1.md + * @brief The commonds, ref 通信协议 */ enum HOSTCOMPUTER_CMD { @@ -38,7 +42,6 @@ enum HOSTCOMPUTER_CMD HOSTCOMPUTER_CMD_SETVALVETRIGPULSECOUNT = 7, HOSTCOMPUTER_CMD_SETCAMERATOVALVEPULSECOUNT = 8, HOSTCOMPUTER_CMD_STOP_TEST = 9 - }; int hostcomputer_init(queue_uint64_msg_t *cmd_q); diff --git a/source/linux_app/main.c b/source/linux_app/main.c index 8bfd955..eff06ab 100644 --- a/source/linux_app/main.c +++ b/source/linux_app/main.c @@ -5,9 +5,9 @@ * @version 1.0 * @date 2022/06/12 * @mainpage github.com/NanjingForestryUniversity - * + * * @copyright Copyright (c) 2022 miaow - * + * * @par Changelog: * *
Date Version Author Description @@ -25,9 +25,12 @@ #include #include -#define SET_VALVE_ONLY_N_ON(u32_buf, n) bzero(u32_buf, sizeof(u32_buf));SET_VALVE_N_ON(u32_buf, n) +#define SET_VALVE_ONLY_N_ON(u32_buf, n) \ + bzero(u32_buf, sizeof(u32_buf)); \ + SET_VALVE_N_ON(u32_buf, n) #define SET_VALVE_N_ON(u32_buf, n) u32_buf[n / 32] = 1 << (n % 32) + /** * @brief Value of state machine */ @@ -42,7 +45,7 @@ queue_uint64_msg_t cmd_queue = {0}; static status_enum_t status = SLEEPING; static int camera_trigger_pulse_count = 1200; static int valve_trigger_pulse_count = 120; -static int camera_to_valve_pulse_count = 5000; +static int camera_to_valve_pulse_count = 500; void process_cmd(uint64_t *cmd); @@ -59,8 +62,40 @@ int main(int argc, char *argv[]) // Initialize drivers and clear all caches encoder_dev_init(); encoder_dev_set_trigmod(ENCODER_TRIG_MODE_INTERNEL); - encoder_dev_set_divide(2, 2); + encoder_dev_set_divide(2, 8); fifo_dev_init(); + + //==test encoder================================================================ + // fifo_dev_init(); + // encoder_dev_set_trigmod(ENCODER_TRIG_MODE_EXTERNEL); + // encoder_dev_set_divide(4, 8); + // int a = 1; + // while (a) + // { + // printf("input a\r\n"); + // scanf("%d", &a); + // printf("a=%d\r\n\r\n\r\n", a); + // } + // encoder_dev_set_trigmod(ENCODER_TRIG_MODE_INTERNEL); + // encoder_dev_deinit(); + // queue_uint64_deinit(&cmd_queue); + // return 0; + + //==test fifo================================================================ + // char data[HOST_COMPUTER_PICTURE_COLUMN_BYTES * HOST_COMPUTER_PICTURE_ROW_NUM + 1]; + // fifo_dev_init(); + // fifo_dev_write_frame(data); + // printf("%d\r\n", fifo_dev_get_count()); + // fifo_dev_write_frame(data); + // printf("%d\r\n", fifo_dev_get_count()); + // fifo_dev_clear(); + // printf("%d\r\n", fifo_dev_get_count()); + // fifo_dev_deinit(); + // encoder_dev_deinit(); + // return 0; + //================================================================== + + fifo_dev_clear(); hostcomputer_init(&cmd_queue); printf("\r\n>>>>>\r\nstatus==SLEEPING\r\n<<<<<\r\n\r\n"); uint64_t cmd; @@ -70,20 +105,20 @@ int main(int argc, char *argv[]) { if (queue_uint64_get(&cmd_queue, &cmd) == 0) process_cmd(&cmd); - usleep(100000); + usleep(1000); } // Never run here hostcomputer_deinit(); fifo_dev_clear(); - encoder_dev_set_divide(2, 2); - encoder_dev_virtual_trig(10); + encoder_dev_set_divide(2, 8); + encoder_dev_virtual_trig(20); fifo_dev_deinit(); encoder_dev_set_trigmod(ENCODER_TRIG_MODE_INTERNEL); encoder_dev_deinit(); queue_uint64_deinit(&cmd_queue); - + return 0; } @@ -91,24 +126,27 @@ int main(int argc, char *argv[]) * @brief Excute the command and control the states * @param cmd The command to be excuted */ -void process_cmd(uint64_t *cmd) +void process_cmd(uint64_t *cmd) { int tmp_cmd = (int)*cmd; int tmp_data = (int)(*cmd >> 32); - // Only in the SLEEPING state, it resbonds to START or TEST command. + // Only in the SLEEPING state, it resbonds to START or TEST command. if (status == SLEEPING) { if (tmp_cmd == HOSTCOMPUTER_CMD_START) { // Before running, clear the hardware fifo and hardware encoder. Then, the two dividers and delay value should be set. - // Also, the hareware encoder is expected to receiving pluse of encoder: the EXTERNAL mode + // Also, the hareware encoder is expected to receiving pluse of encoder: the EXTERNAL mode fifo_dev_clear(); - fifo_dev_write_delay(camera_to_valve_pulse_count); encoder_dev_flush(); + encoder_dev_set_divide(valve_trigger_pulse_count, camera_trigger_pulse_count); + fifo_dev_write_delay(camera_to_valve_pulse_count + HOST_COMPUTER_PICTURE_ROW_NUM * HOST_COMPUTER_PICTURES_BEGINNING_IGNORE_NUM); encoder_dev_set_trigmod(ENCODER_TRIG_MODE_EXTERNEL); - printf("\r\n>>>>>\r\nstatus==RUNNING\r\ncamera_trigger_pulse_count=%d\r\nvalve_trigger_pulse_count=%d\r\ncamera_to_valve_pulse_count=%d\r\n<<<<<\r\n\r\n", camera_trigger_pulse_count, valve_trigger_pulse_count, camera_to_valve_pulse_count); + printf("\r\n>>>>>\r\nstatus==RUNNING\r\ncamera_trigger_pulse_count=%d\r\nvalve_trigger_pulse_count=%d\r\n" + "camera_to_valve_pulse_count=%d\r\n<<<<<\r\n\r\n", camera_trigger_pulse_count, + valve_trigger_pulse_count, camera_to_valve_pulse_count + HOST_COMPUTER_PICTURE_ROW_NUM * HOST_COMPUTER_PICTURES_BEGINNING_IGNORE_NUM); status = RUNNING; } else if (tmp_cmd == HOSTCOMPUTER_CMD_TEST) @@ -120,16 +158,16 @@ void process_cmd(uint64_t *cmd) fifo_dev_clear(); encoder_dev_flush(); encoder_dev_set_trigmod(ENCODER_TRIG_MODE_INTERNEL); - encoder_dev_set_divide(2, 2); + encoder_dev_set_divide(2, 8); // fifo out every 8/4=2 cycle, valveboard operate every 2 cycle // A parameter below 256 represents a single shot, the value of parameter indicates the valve to triggle. if (tmp_data < 256) { SET_VALVE_ONLY_N_ON(row_data, tmp_data); fifo_dev_write_row(row_data); - // delay for 100 ms and turn off the valve + // delay for 15000 us and turn off the valve encoder_dev_virtual_trig(2); - usleep(100000); + usleep(15000); encoder_dev_virtual_trig(2); } // 257 represents triggle valve from NO.1 to 256 sequenctially. This loop blocks for 25.7s. @@ -139,11 +177,17 @@ void process_cmd(uint64_t *cmd) { SET_VALVE_ONLY_N_ON(row_data, i); fifo_dev_write_row(row_data); + bzero(&row_data, sizeof(row_data)); + fifo_dev_write_row(row_data); + // printf("%d,%d\r\n", fifo_dev_get_count(), fifob_dev_get_count()); } for (int i = 0; i < 257; i++) { encoder_dev_virtual_trig(2); - usleep(100000); + usleep(15000); + encoder_dev_virtual_trig(2); + usleep(100000 - 15000); + // printf("%d,%d\r\n", fifo_dev_get_count(), fifob_dev_get_count()); } } } @@ -164,14 +208,14 @@ void process_cmd(uint64_t *cmd) else if (status == RUNNING) { if (tmp_cmd == HOSTCOMPUTER_CMD_STOP) - { + { // Clear hardware fifo. // 10 virtual triggles in internal mode ensure valve is turned off. // Hardware encoder is flushed for a fresh start. fifo_dev_clear(); encoder_dev_set_trigmod(ENCODER_TRIG_MODE_INTERNEL); - encoder_dev_set_divide(2, 2); - encoder_dev_virtual_trig(10); + encoder_dev_set_divide(4, 4); + encoder_dev_virtual_trig(20); encoder_dev_flush(); status = SLEEPING; printf("\r\n>>>>>\r\nstatus==SLEEPING\r\n<<<<<\r\n\r\n"); diff --git a/source/linux_app/main.h b/source/linux_app/main.h new file mode 100644 index 0000000..e69de29 diff --git a/source/linux_app/queue_uint64.c b/source/linux_app/queue_uint64.c index fecac84..b49d43c 100644 --- a/source/linux_app/queue_uint64.c +++ b/source/linux_app/queue_uint64.c @@ -7,9 +7,9 @@ * @version 1.0 * @date 2021/01/10 * @mainpage github.com/NanjingForestryUniversity - * + * * @copyright Copyright (c) 2022 miaow - * + * * @par Changelog: * *
Date Version Author Description @@ -114,8 +114,11 @@ int queue_uint64_init(queue_uint64_msg_t *q, int max_count) */ int queue_uint64_deinit(queue_uint64_msg_t *q) { - free(q->buffer); - q->buffer = NULL; + if (q->buffer != NULL) + { + free(q->buffer); + q->buffer = NULL; + } pthread_mutex_destroy(&q->_mux); // pthread_cond_destroy(&q->_cond_get); // pthread_cond_destroy(&q->_cond_put); diff --git a/source/linux_app/version b/source/linux_app/version index 9f8e9b6..ea710ab 100644 --- a/source/linux_app/version +++ b/source/linux_app/version @@ -1 +1 @@ -1.0 \ No newline at end of file +1.2 \ No newline at end of file diff --git a/source/linux_driver/encoder.c b/source/linux_driver/encoder.c index 65e66c8..c66484a 100644 --- a/source/linux_driver/encoder.c +++ b/source/linux_driver/encoder.c @@ -9,7 +9,7 @@ #include #include -#define ENCODER_CNT 1 /* 主设备号 */ +#define ENCODER_CNT 1 /* 主设备号 */ #define ENCODER_NAME "encoder" /* 设备名字 */ #define ENCODER_CMD_FUNCTION_CLEAR 1 @@ -18,7 +18,6 @@ #define ENCODER_CMD_INPUT_MODE_EXTERNEL 100 #define ENCODER_CMD_INPUT_MODE_INTERNEL 101 - /* * 相关寄存器地址定义 */ @@ -28,26 +27,30 @@ #define ENCODER_REG_2_OFFSET 0x00000008 #define ENCODER_REG_3_OFFSET 0x0000000C +#define ENCODER_CR_VTS_MASK ((u32)(1 << 2)) // 内部触发信号 (Virtual Triggle Signal) MOD位置1时,由上位机软件写入,将该位信号作为触发信号 +#define ENCODER_CR_MOD_MASK ((u32)(1 << 1)) // 模式选择 (Mode) 0: 外部触发模式,外部触发编码器转动, 1: 内部触发模式,上位机软件模拟触发信号 +#define ENCODER_CR_CLR_MASK ((u32)(1 << 0)) // 清除缓存 (Clear) 清除编码和分频控制器内部的分频计数值,不影响VDIV和CDIV + /* 映射后的寄存器虚拟地址指针 */ -static void __iomem *encoder_reg_0_addr; -static void __iomem *encoder_reg_1_addr; -static void __iomem *encoder_reg_2_addr; -static void __iomem *encoder_reg_3_addr; +static void __iomem *encoder_cr_addr; +static void __iomem *encoder_vdivr_addr; +static void __iomem *encoder_cdivr_addr; +static void __iomem *encoder_reg3_addr; struct encoder_dev { - dev_t devid; /* 设备号 */ - struct cdev cdev; /* cdev */ - struct class *class; /* 类 */ - struct device *device; /* 设备 */ - int major; /* 主设备号 */ - int minor; /* 次设备号 */ + dev_t devid; /* 设备号 */ + struct cdev cdev; /* cdev */ + struct class *class; /* 类 */ + struct device *device; /* 设备 */ + int major; /* 主设备号 */ + int minor; /* 次设备号 */ }; typedef struct { - u32 valve_divide_value; - u32 camera_divide_value; + u32 valve_divide_value; + u32 camera_divide_value; } kernelbuf_typedef; static struct encoder_dev encoder; @@ -61,7 +64,7 @@ static struct encoder_dev encoder; */ static int encoder_open(struct inode *inode, struct file *filp) { - return 0; + return 0; } /* @@ -74,38 +77,43 @@ static int encoder_open(struct inode *inode, struct file *filp) */ static ssize_t encoder_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt) { - int ret; - - u32 data; - kernelbuf_typedef kern_buf = { - .valve_divide_value = 0, - .camera_divide_value = 0, - }; - if (cnt != sizeof(kern_buf)) - { - printk(KERN_ERR "encoder write: cnt error, cnt=%d", cnt); - return -EFAULT; - } - ret = copy_from_user(&kern_buf, buf, cnt); // 得到应用层传递过来的数据 - if (ret < 0) - { - printk(KERN_ERR "kernel write failed!\r\n"); - return -EFAULT; - } - if (!(kern_buf.valve_divide_value || kern_buf.camera_divide_value)) - return 0; - - data = readl(encoder_reg_0_addr); - writel(data & ~(u32)(1 << 0), encoder_reg_0_addr); + int ret; - if (kern_buf.valve_divide_value != 0) - writel(kern_buf.valve_divide_value, encoder_reg_1_addr); - if (kern_buf.camera_divide_value != 0) - writel(kern_buf.camera_divide_value, encoder_reg_2_addr); + u32 data; + kernelbuf_typedef kern_buf = { + .valve_divide_value = 0, + .camera_divide_value = 0, + }; + if (cnt != sizeof(kern_buf)) + { + printk(KERN_ERR "encoder write: cnt error, cnt=%d", cnt); + return -EFAULT; + } + ret = copy_from_user(&kern_buf, buf, cnt); // 得到应用层传递过来的数据 + if (ret < 0) + { + printk(KERN_ERR "kernel write failed!\r\n"); + return -EFAULT; + } + // 最小分频值为4 + if (kern_buf.valve_divide_value < 2 || kern_buf.camera_divide_value < 4) + { + return -EFAULT; + } - writel(data | (u32)(1 << 0), encoder_reg_0_addr); + // 写入0后清除ENCODER内部计数器缓存清除 + data = readl(encoder_cr_addr); + writel(data & ~ENCODER_CR_CLR_MASK, encoder_cr_addr); - return cnt; + if (kern_buf.valve_divide_value != 0) + writel(kern_buf.valve_divide_value, encoder_vdivr_addr); + if (kern_buf.camera_divide_value != 0) + writel(kern_buf.camera_divide_value, encoder_cdivr_addr); + + // 写入1退出清除状态,使得ENCODER内部计数器能正常工作,内部计数器在正常工作前已经被清零 + writel(data | ENCODER_CR_CLR_MASK, encoder_cr_addr); + + return cnt; } /* @@ -115,158 +123,163 @@ static ssize_t encoder_write(struct file *filp, const char __user *buf, size_t c */ static int encoder_release(struct inode *inode, struct file *filp) { - return 0; + return 0; } static long encoder_ioctl(struct file *fp, unsigned int cmd, unsigned long tmp) { - u32 data, cmd_parsed; - if (_IOC_TYPE(cmd) != 'D' || _IOC_DIR(cmd) != _IOC_WRITE) - { - printk(KERN_ERR "IOC_TYPE or IOC_WRITE error: IOC_TYPE=%c, IOC_WRITE=%d\r\n", _IOC_TYPE(cmd), _IOC_DIR(cmd)); - return -EINVAL; - } - cmd_parsed = _IOC_NR(cmd); - data = readl(encoder_reg_0_addr); - if (cmd_parsed == ENCODER_CMD_FUNCTION_CLEAR) - { - writel(data & ~(u32)(1 << 0), encoder_reg_0_addr); - writel(data | (u32)(1 << 0), encoder_reg_0_addr); - } - else if (cmd_parsed == ENCODER_CMD_INPUT_MODE_EXTERNEL) - { - writel(data & ~(u32)(1 << 1), encoder_reg_0_addr); - } - else if (cmd_parsed == ENCODER_CMD_INPUT_MODE_INTERNEL) - { - writel(data | (u32)(1 << 1), encoder_reg_0_addr); - } - else if (cmd_parsed == ENCODER_CMD_FUNCTION_VIRT_INPUT) - { - int i; - // 1. ENCODER_CMD_INPUT_MODE_INTERNEL - writel(data | (u32)(1 << 1), encoder_reg_0_addr); - // 2. Generate pluses - for (i = 0; i < tmp; i++) - { - writel(data & ~(u32)(1 << 2), encoder_reg_0_addr); - writel(data | (u32)(1 << 2), encoder_reg_0_addr); - } - // 3. Recover the original configuration - writel(data, encoder_reg_0_addr); - } + u32 data, cmd_parsed; + if (_IOC_TYPE(cmd) != 'D' || _IOC_DIR(cmd) != _IOC_WRITE) + { + printk(KERN_ERR "IOC_TYPE or IOC_WRITE error: IOC_TYPE=%c, IOC_WRITE=%d\r\n", _IOC_TYPE(cmd), _IOC_DIR(cmd)); + return -EINVAL; + } + cmd_parsed = _IOC_NR(cmd); + data = readl(encoder_cr_addr); + if (cmd_parsed == ENCODER_CMD_FUNCTION_CLEAR) + { + writel(data & ~ENCODER_CR_CLR_MASK, encoder_cr_addr); // 写入0后清除ENCODER内部计数器缓存清除 + writel(data | ENCODER_CR_CLR_MASK, encoder_cr_addr); // 写入1退出清除状态,使得ENCODER内部计数器能正常工作,内部计数器在正常工作前已经被清零 + } + else if (cmd_parsed == ENCODER_CMD_INPUT_MODE_EXTERNEL) + { + // 设为外部触发模式 + writel(data & ~ENCODER_CR_MOD_MASK, encoder_cr_addr); + } + else if (cmd_parsed == ENCODER_CMD_INPUT_MODE_INTERNEL) + { + // 设为内部触发模式 + writel(data | (u32)(1 << 1), encoder_cr_addr); + } + else if (cmd_parsed == ENCODER_CMD_FUNCTION_VIRT_INPUT) + { + int i; + // 虚拟触发,tmp为周期数 + // 1. 设为内部触发模式 + writel(data | (u32)(1 << 1), encoder_cr_addr); - return 0; + // 2. 产生虚拟的高低电平 + for (i = 0; i < tmp; i++) + { + writel(data & ~ENCODER_CR_VTS_MASK, encoder_cr_addr); + writel(data | ENCODER_CR_VTS_MASK, encoder_cr_addr); + } + + // 3. 恢复为原来的状态和模式 + writel(data, encoder_cr_addr); + } + + return 0; } /* 设备操作函数 */ static struct file_operations encoder_fops = { - .owner = THIS_MODULE, - .open = encoder_open, - .write = encoder_write, - .release = encoder_release, - .unlocked_ioctl = encoder_ioctl, + .owner = THIS_MODULE, + .open = encoder_open, + .write = encoder_write, + .release = encoder_release, + .unlocked_ioctl = encoder_ioctl, }; static int __init encoder_init(void) { - int ret; - u32 data; - /* 寄存器地址映射 */ - encoder_reg_0_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_0_OFFSET, 4); - encoder_reg_1_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_1_OFFSET, 4); - encoder_reg_2_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_2_OFFSET, 4); - encoder_reg_3_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_3_OFFSET, 4); + int ret; + u32 data; + /* 寄存器地址映射 */ + encoder_cr_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_0_OFFSET, 4); + encoder_vdivr_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_1_OFFSET, 4); + encoder_cdivr_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_2_OFFSET, 4); + encoder_reg3_addr = ioremap(ENCODER_REG_BASE + ENCODER_REG_3_OFFSET, 4); - /* 注册字符设备驱动 */ - //(1)创建设备号 - if (encoder.major) - { - encoder.devid = MKDEV(encoder.major, 0); - ret = register_chrdev_region(encoder.devid, ENCODER_CNT, ENCODER_NAME); - if (ret) - goto FAIL_REGISTER_CHR_DEV; - } - else - { - ret = alloc_chrdev_region(&encoder.devid, 0, ENCODER_CNT, ENCODER_NAME); - if (ret) - goto FAIL_REGISTER_CHR_DEV; - encoder.major = MAJOR(encoder.devid); - encoder.minor = MINOR(encoder.devid); - } + /* 注册字符设备驱动 */ + //(1)创建设备号 + if (encoder.major) + { + encoder.devid = MKDEV(encoder.major, 0); + ret = register_chrdev_region(encoder.devid, ENCODER_CNT, ENCODER_NAME); + if (ret) + goto FAIL_REGISTER_CHR_DEV; + } + else + { + ret = alloc_chrdev_region(&encoder.devid, 0, ENCODER_CNT, ENCODER_NAME); + if (ret) + goto FAIL_REGISTER_CHR_DEV; + encoder.major = MAJOR(encoder.devid); + encoder.minor = MINOR(encoder.devid); + } - //(2)初始化cdev - encoder.cdev.owner = THIS_MODULE; - cdev_init(&encoder.cdev, &encoder_fops); + //(2)初始化cdev + encoder.cdev.owner = THIS_MODULE; + cdev_init(&encoder.cdev, &encoder_fops); - //(3)添加cdev - ret = cdev_add(&encoder.cdev, encoder.devid, ENCODER_CNT); - if (ret) - goto FAIL_ADD_CDEV; + //(3)添加cdev + ret = cdev_add(&encoder.cdev, encoder.devid, ENCODER_CNT); + if (ret) + goto FAIL_ADD_CDEV; - //(4)创建类 - encoder.class = class_create(THIS_MODULE, ENCODER_NAME); - if (IS_ERR(encoder.class)) - { - ret = PTR_ERR(encoder.class); - goto FAIL_CREATE_CLASS; - } + //(4)创建类 + encoder.class = class_create(THIS_MODULE, ENCODER_NAME); + if (IS_ERR(encoder.class)) + { + ret = PTR_ERR(encoder.class); + goto FAIL_CREATE_CLASS; + } - //(5)创建设备 - encoder.device = device_create(encoder.class, NULL, encoder.devid, NULL, ENCODER_NAME); - if (IS_ERR(encoder.device)) - { - ret = PTR_ERR(encoder.device); - goto FAIL_CREATE_DEV; - } + //(5)创建设备 + encoder.device = device_create(encoder.class, NULL, encoder.devid, NULL, ENCODER_NAME); + if (IS_ERR(encoder.device)) + { + ret = PTR_ERR(encoder.device); + goto FAIL_CREATE_DEV; + } - //默认分频系数1000 - data = readl(encoder_reg_0_addr); - writel(data & ~(u32)(1 << 0), encoder_reg_0_addr); - writel(1000, encoder_reg_1_addr); - writel(1000, encoder_reg_2_addr); - writel(data | (u32)(1 << 0), encoder_reg_0_addr); + //默认分频系数1000 + data = readl(encoder_cr_addr); + writel(data & ~ENCODER_CR_CLR_MASK, encoder_cr_addr); // 清除硬件计数器缓存 + writel(1000, encoder_vdivr_addr); // 设置阀触发分频 + writel(1000, encoder_cdivr_addr); // 设置相机触发分频 + writel(data | ENCODER_CR_CLR_MASK, encoder_cr_addr); // 清除完毕 - return 0; + return 0; FAIL_CREATE_DEV: - class_destroy(encoder.class); + class_destroy(encoder.class); FAIL_CREATE_CLASS: - cdev_del(&encoder.cdev); + cdev_del(&encoder.cdev); FAIL_ADD_CDEV: - unregister_chrdev_region(encoder.devid, ENCODER_CNT); + unregister_chrdev_region(encoder.devid, ENCODER_CNT); FAIL_REGISTER_CHR_DEV: - iounmap(encoder_reg_0_addr); - iounmap(encoder_reg_1_addr); - iounmap(encoder_reg_2_addr); - iounmap(encoder_reg_3_addr); + iounmap(encoder_cr_addr); + iounmap(encoder_vdivr_addr); + iounmap(encoder_cdivr_addr); + iounmap(encoder_reg3_addr); - return ret; + return ret; } static void __exit encoder_exit(void) { - //(1)注销设备 - device_destroy(encoder.class, encoder.devid); + //(1)注销设备 + device_destroy(encoder.class, encoder.devid); - //(2)注销类 - class_destroy(encoder.class); + //(2)注销类 + class_destroy(encoder.class); - //(3)删除cdev - cdev_del(&encoder.cdev); + //(3)删除cdev + cdev_del(&encoder.cdev); - //(4)注销设备号 - unregister_chrdev_region(encoder.devid, ENCODER_CNT); + //(4)注销设备号 + unregister_chrdev_region(encoder.devid, ENCODER_CNT); - //(5)取消内存映射 - iounmap(encoder_reg_0_addr); - iounmap(encoder_reg_1_addr); - iounmap(encoder_reg_2_addr); - iounmap(encoder_reg_3_addr); + //(5)取消内存映射 + iounmap(encoder_cr_addr); + iounmap(encoder_vdivr_addr); + iounmap(encoder_cdivr_addr); + iounmap(encoder_reg3_addr); } /* 驱动模块入口和出口函数注册 */ @@ -274,4 +287,4 @@ module_init(encoder_init); module_exit(encoder_exit); MODULE_AUTHOR("DingKun"); MODULE_DESCRIPTION("driver for hardware encoder in the platform"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL"); \ No newline at end of file diff --git a/source/linux_driver/fifo.c b/source/linux_driver/fifo.c index f230af8..703219d 100644 --- a/source/linux_driver/fifo.c +++ b/source/linux_driver/fifo.c @@ -14,6 +14,7 @@ #define FIFO_NAME "fifo" /* 名字 */ #define FIFO_CMD_FUNCTION_CLEAR 1 #define FIFO_CMD_FUNCTION_PADDING 2 +#define FIFO_CMD_GET_EMPTYCOUNT 3 /* * 相关寄存器地址定义 @@ -35,22 +36,34 @@ #define FIFO_REG_13_OFFSET 0x00000034 #define FIFO_REG_14_OFFSET 0x00000038 +#define FIFO_CR_CLR_MASK ((u32)(1 << 1)) // 清空队列 (Clear) 对该位写入1,队列将清空,同时队列输出为全0。注意:不要写入除1以外的任何值。 +#define FIFO_CR_WS_MASK ((u32)(1 << 0)) // 写入同步 (Write Synchronization) 对该位写入1,FIFO_DATx的数据按字节小端序进入队列。 注意:不要写入除1以外的任何值。 + +#define FIFO_SR_VLD_MASK ((u32)(1 << 16)) // 数据输出有效标志 (Valid) 0: 当前无有效输出,输出保持上一状态 1: 当前队列正在输出有效数据 +#define FIFO_SR_AMEM_MASK ((u32)(1 << 15)) // 队列将空标志 (Almost Empty) 0: 队列没有被读空 1: 队列在一个读时钟周期后会被读空 +#define FIFO_SR_EM_MASK ((u32)(1 << 14)) // 队列空标志 (Empty) 0: 队列中存在有效数据,没有被读空 1: 队列中已经没有有效数据 +#define FIFO_SR_AMFU_MASK ((u32)(1 << 13)) // 队列将满标志 (Almost Full) 0: 队列没有被写满 1: 队列在一个写时钟周期后会被写满 +#define FIFO_SR_FU_MASK ((u32)(1 << 12)) // 队列满标志 (Almost Full) 0: 队列中的有效数据小于FIFO数据深度 1: 队列中的有效数据达到FIFO数据深度 +#define FIFO_SR_CNT_MASK ((u32)(0xFFF << 0)) // 队列数据数量 (Data Count) 该值指示队列中的数据数量 注意:一个数据为384位宽 + +#define FIFO_ECR_CNT_MASK ((u32)0xFFFFFFFF) // 队列空读取累计次数 + /* 映射后的寄存器虚拟地址指针 */ -static void __iomem *fifo_reg_0_addr; -static void __iomem *fifo_reg_1_addr; -static void __iomem *fifo_reg_2_addr; -static void __iomem *fifo_reg_3_addr; -static void __iomem *fifo_reg_4_addr; -static void __iomem *fifo_reg_5_addr; -static void __iomem *fifo_reg_6_addr; -static void __iomem *fifo_reg_7_addr; -static void __iomem *fifo_reg_8_addr; -static void __iomem *fifo_reg_9_addr; -static void __iomem *fifo_reg_10_addr; -static void __iomem *fifo_reg_11_addr; -static void __iomem *fifo_reg_12_addr; -static void __iomem *fifo_reg_13_addr; -static void __iomem *fifo_reg_14_addr; +static void __iomem *fifo_dat0_addr; +static void __iomem *fifo_dat1_addr; +static void __iomem *fifo_dat2_addr; +static void __iomem *fifo_dat3_addr; +static void __iomem *fifo_dat4_addr; +static void __iomem *fifo_dat5_addr; +static void __iomem *fifo_dat6_addr; +static void __iomem *fifo_dat7_addr; +static void __iomem *fifo_dat8_addr; +static void __iomem *fifo_dat9_addr; +static void __iomem *fifo_dat10_addr; +static void __iomem *fifo_dat11_addr; +static void __iomem *fifo_sr_addr; +static void __iomem *fifo_ecr_addr; +static void __iomem *fifo_cr_addr; /* fifo设备结构体 */ struct fifo_dev @@ -87,7 +100,7 @@ static int fifo_open(struct inode *inode, struct file *filp) */ static ssize_t fifo_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt) { - u32 data = readl(fifo_reg_12_addr) & 0xFFF; + u32 data = readl(fifo_sr_addr) & FIFO_SR_CNT_MASK; copy_to_user(buf, &data, 4); return cnt; } @@ -109,7 +122,7 @@ static ssize_t fifo_write(struct file *filp, const char __user *buf, size_t cnt, if (cnt % 32 != 0 || cnt > sizeof(kern_buf_u32)) { - printk(KERN_ERR "cnt error, cnt=%d\r\n", cnt); + printk(KERN_ERR "cnt error, cnt=%d, sizeof=%d\r\n", cnt, (u32)sizeof(kern_buf_u32)); return -1; } @@ -122,19 +135,19 @@ static ssize_t fifo_write(struct file *filp, const char __user *buf, size_t cnt, for (i = 0; i < (cnt / sizeof(u32)); i += 8) { - writel(kern_buf_u32[i], fifo_reg_0_addr); - writel(kern_buf_u32[i + 1], fifo_reg_1_addr); - writel(kern_buf_u32[i + 2], fifo_reg_2_addr); - writel(kern_buf_u32[i + 3], fifo_reg_3_addr); - writel(kern_buf_u32[i + 4], fifo_reg_4_addr); - writel(kern_buf_u32[i + 5], fifo_reg_5_addr); - writel(kern_buf_u32[i + 6], fifo_reg_6_addr); - writel(kern_buf_u32[i + 7], fifo_reg_7_addr); - writel(0, fifo_reg_8_addr); - writel(0, fifo_reg_9_addr); - writel(0, fifo_reg_10_addr); - writel(0, fifo_reg_11_addr); - writel(1, fifo_reg_14_addr); + writel(kern_buf_u32[i], fifo_dat0_addr); + writel(kern_buf_u32[i + 1], fifo_dat1_addr); + writel(kern_buf_u32[i + 2], fifo_dat2_addr); + writel(kern_buf_u32[i + 3], fifo_dat3_addr); + writel(kern_buf_u32[i + 4], fifo_dat4_addr); + writel(kern_buf_u32[i + 5], fifo_dat5_addr); + writel(kern_buf_u32[i + 6], fifo_dat6_addr); + writel(kern_buf_u32[i + 7], fifo_dat7_addr); + writel(0, fifo_dat8_addr); + writel(0, fifo_dat9_addr); + writel(0, fifo_dat10_addr); + writel(0, fifo_dat11_addr); + writel(FIFO_CR_WS_MASK, fifo_cr_addr); } return cnt; @@ -152,33 +165,45 @@ static int fifo_release(struct inode *inode, struct file *filp) static long fifo_ioctl(struct file *fp, unsigned int cmd, unsigned long tmp) { - if (_IOC_TYPE(cmd) != 'D' || _IOC_DIR(cmd) != _IOC_WRITE) + if (_IOC_TYPE(cmd) != 'D') { printk(KERN_ERR "IOC_TYPE or IOC_WRITE error: IOC_TYPE=%c, IOC_WRITE=%d\r\n", _IOC_TYPE(cmd), _IOC_DIR(cmd)); return -EINVAL; } - if (_IOC_NR(cmd) == FIFO_CMD_FUNCTION_CLEAR) + if (_IOC_NR(cmd) == FIFO_CMD_GET_EMPTYCOUNT) { - writel(((u32)1 << 1), fifo_reg_14_addr); + u32 empty_count = readl(fifo_ecr_addr) & FIFO_ECR_CNT_MASK; + printk("%d\r\n", empty_count); + if (copy_to_user((u32 *)tmp, &empty_count, 4) < 0) + { + printk(KERN_ERR "get empty count error\r\n"); + return -EINVAL; + } + } + else if (_IOC_NR(cmd) == FIFO_CMD_FUNCTION_CLEAR) + { + // 清空队列 + writel(FIFO_CR_CLR_MASK, fifo_cr_addr); } else if (_IOC_NR(cmd) == FIFO_CMD_FUNCTION_PADDING) { + // 对队列中添加tmp个数的0元素 int i; for (i = 0; i < tmp; i ++) { - writel((u32)0, fifo_reg_0_addr); - writel((u32)0, fifo_reg_1_addr); - writel((u32)0, fifo_reg_2_addr); - writel((u32)0, fifo_reg_3_addr); - writel((u32)0, fifo_reg_4_addr); - writel((u32)0, fifo_reg_5_addr); - writel((u32)0, fifo_reg_6_addr); - writel((u32)0, fifo_reg_7_addr); - writel((u32)0, fifo_reg_8_addr); - writel((u32)0, fifo_reg_9_addr); - writel((u32)0, fifo_reg_10_addr); - writel((u32)0, fifo_reg_11_addr); - writel((u32)1, fifo_reg_14_addr); + writel((u32)0, fifo_dat0_addr); + writel((u32)0, fifo_dat1_addr); + writel((u32)0, fifo_dat2_addr); + writel((u32)0, fifo_dat3_addr); + writel((u32)0, fifo_dat4_addr); + writel((u32)0, fifo_dat5_addr); + writel((u32)0, fifo_dat6_addr); + writel((u32)0, fifo_dat7_addr); + writel((u32)0, fifo_dat8_addr); + writel((u32)0, fifo_dat9_addr); + writel((u32)0, fifo_dat10_addr); + writel((u32)0, fifo_dat11_addr); + writel(FIFO_CR_WS_MASK, fifo_cr_addr); } } return 0; @@ -198,21 +223,21 @@ static int __init fifo_init(void) { int ret; /* 寄存器地址映射 */ - fifo_reg_0_addr = ioremap(FIFO_REG_BASE + FIFO_REG_0_OFFSET, 4); - fifo_reg_1_addr = ioremap(FIFO_REG_BASE + FIFO_REG_1_OFFSET, 4); - fifo_reg_2_addr = ioremap(FIFO_REG_BASE + FIFO_REG_2_OFFSET, 4); - fifo_reg_3_addr = ioremap(FIFO_REG_BASE + FIFO_REG_3_OFFSET, 4); - fifo_reg_4_addr = ioremap(FIFO_REG_BASE + FIFO_REG_4_OFFSET, 4); - fifo_reg_5_addr = ioremap(FIFO_REG_BASE + FIFO_REG_5_OFFSET, 4); - fifo_reg_6_addr = ioremap(FIFO_REG_BASE + FIFO_REG_6_OFFSET, 4); - fifo_reg_7_addr = ioremap(FIFO_REG_BASE + FIFO_REG_7_OFFSET, 4); - fifo_reg_8_addr = ioremap(FIFO_REG_BASE + FIFO_REG_8_OFFSET, 4); - fifo_reg_9_addr = ioremap(FIFO_REG_BASE + FIFO_REG_9_OFFSET, 4); - fifo_reg_10_addr = ioremap(FIFO_REG_BASE + FIFO_REG_10_OFFSET, 4); - fifo_reg_11_addr = ioremap(FIFO_REG_BASE + FIFO_REG_11_OFFSET, 4); - fifo_reg_12_addr = ioremap(FIFO_REG_BASE + FIFO_REG_12_OFFSET, 4); - fifo_reg_13_addr = ioremap(FIFO_REG_BASE + FIFO_REG_13_OFFSET, 4); - fifo_reg_14_addr = ioremap(FIFO_REG_BASE + FIFO_REG_14_OFFSET, 4); + fifo_dat0_addr = ioremap(FIFO_REG_BASE + FIFO_REG_0_OFFSET, 4); + fifo_dat1_addr = ioremap(FIFO_REG_BASE + FIFO_REG_1_OFFSET, 4); + fifo_dat2_addr = ioremap(FIFO_REG_BASE + FIFO_REG_2_OFFSET, 4); + fifo_dat3_addr = ioremap(FIFO_REG_BASE + FIFO_REG_3_OFFSET, 4); + fifo_dat4_addr = ioremap(FIFO_REG_BASE + FIFO_REG_4_OFFSET, 4); + fifo_dat5_addr = ioremap(FIFO_REG_BASE + FIFO_REG_5_OFFSET, 4); + fifo_dat6_addr = ioremap(FIFO_REG_BASE + FIFO_REG_6_OFFSET, 4); + fifo_dat7_addr = ioremap(FIFO_REG_BASE + FIFO_REG_7_OFFSET, 4); + fifo_dat8_addr = ioremap(FIFO_REG_BASE + FIFO_REG_8_OFFSET, 4); + fifo_dat9_addr = ioremap(FIFO_REG_BASE + FIFO_REG_9_OFFSET, 4); + fifo_dat10_addr = ioremap(FIFO_REG_BASE + FIFO_REG_10_OFFSET, 4); + fifo_dat11_addr = ioremap(FIFO_REG_BASE + FIFO_REG_11_OFFSET, 4); + fifo_sr_addr = ioremap(FIFO_REG_BASE + FIFO_REG_12_OFFSET, 4); + fifo_ecr_addr = ioremap(FIFO_REG_BASE + FIFO_REG_13_OFFSET, 4); + fifo_cr_addr = ioremap(FIFO_REG_BASE + FIFO_REG_14_OFFSET, 4); /* 注册字符设备驱动 */ //(1)创建设备号 @@ -269,21 +294,21 @@ FAIL_ADD_CDEV: unregister_chrdev_region(fifo.devid, FIFO_CNT); FAIL_REGISTER_CHR_DEV: - iounmap(fifo_reg_0_addr); - iounmap(fifo_reg_1_addr); - iounmap(fifo_reg_2_addr); - iounmap(fifo_reg_3_addr); - iounmap(fifo_reg_4_addr); - iounmap(fifo_reg_5_addr); - iounmap(fifo_reg_6_addr); - iounmap(fifo_reg_7_addr); - iounmap(fifo_reg_8_addr); - iounmap(fifo_reg_9_addr); - iounmap(fifo_reg_10_addr); - iounmap(fifo_reg_11_addr); - iounmap(fifo_reg_12_addr); - iounmap(fifo_reg_13_addr); - iounmap(fifo_reg_14_addr); + iounmap(fifo_dat0_addr); + iounmap(fifo_dat1_addr); + iounmap(fifo_dat2_addr); + iounmap(fifo_dat3_addr); + iounmap(fifo_dat4_addr); + iounmap(fifo_dat5_addr); + iounmap(fifo_dat6_addr); + iounmap(fifo_dat7_addr); + iounmap(fifo_dat8_addr); + iounmap(fifo_dat9_addr); + iounmap(fifo_dat10_addr); + iounmap(fifo_dat11_addr); + iounmap(fifo_sr_addr); + iounmap(fifo_ecr_addr); + iounmap(fifo_cr_addr); return ret; } @@ -304,21 +329,21 @@ static void __exit fifo_exit(void) unregister_chrdev_region(fifo.devid, FIFO_CNT); //(5)取消内存映射 - iounmap(fifo_reg_0_addr); - iounmap(fifo_reg_1_addr); - iounmap(fifo_reg_2_addr); - iounmap(fifo_reg_3_addr); - iounmap(fifo_reg_4_addr); - iounmap(fifo_reg_5_addr); - iounmap(fifo_reg_6_addr); - iounmap(fifo_reg_7_addr); - iounmap(fifo_reg_8_addr); - iounmap(fifo_reg_9_addr); - iounmap(fifo_reg_10_addr); - iounmap(fifo_reg_11_addr); - iounmap(fifo_reg_12_addr); - iounmap(fifo_reg_13_addr); - iounmap(fifo_reg_14_addr); + iounmap(fifo_dat0_addr); + iounmap(fifo_dat1_addr); + iounmap(fifo_dat2_addr); + iounmap(fifo_dat3_addr); + iounmap(fifo_dat4_addr); + iounmap(fifo_dat5_addr); + iounmap(fifo_dat6_addr); + iounmap(fifo_dat7_addr); + iounmap(fifo_dat8_addr); + iounmap(fifo_dat9_addr); + iounmap(fifo_dat10_addr); + iounmap(fifo_dat11_addr); + iounmap(fifo_sr_addr); + iounmap(fifo_ecr_addr); + iounmap(fifo_cr_addr); } /* 驱动模块入口和出口函数注册 */ diff --git a/source/linux_driver/version b/source/linux_driver/version index 9f8e9b6..ea710ab 100644 --- a/source/linux_driver/version +++ b/source/linux_driver/version @@ -1 +1 @@ -1.0 \ No newline at end of file +1.2 \ No newline at end of file diff --git a/source/petalinux_hwdescription/version b/source/petalinux_hwdescription/version index 9f8e9b6..b123147 100644 --- a/source/petalinux_hwdescription/version +++ b/source/petalinux_hwdescription/version @@ -1 +1 @@ -1.0 \ No newline at end of file +1.1 \ No newline at end of file