myriscv-fesvr/README.md

77 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

RISC-V Frontend Server
=========================
About
---------
This repository contains the front-end server library, which facilitates
communication between a host machine and a RISC-V target machine. It is
usually not meant to be used as a standalone package.
Build Steps
---------------
Execute the following commands to install the library, assuming you've
declared the RISCV environment variable to point to the RISC-V install path:
$ mkdir build
$ cd build
$ ../configure --prefix=$RISCV
$ make install
---
以上是原版README。
## 修改内容
ioctl、mmap、munmap三个系统调用函数是原版的riscv-fesvr不支持的所以我们对riscv-fesvr的系统调用模块进行了修改。修改的代码集中在fesvr/syscall.cc共添加了4个函数
* `reg_t syscall_t::sys_ioctl(reg_t fd, reg_t request, reg_t data)`参数和返回值的意义和Linux的ioctl一样但是由于要确定data指向的数据的大小所以支持的request值只能是VIDIOC_S_FMT、VIDIOC_REQBUFS、VIDIOC_QUERYBUF、VIDIOC_QBUF、VIDIOC_DQBUF、VIDIOC_STREAMON和VIDIOC_STREAMOFF中的一个。
* `reg_t syscall_t::sys_mmap(reg_t addr, reg_t length, reg_t prot, reg_t flags, reg_t fd, reg_t offset)`参数的意义和Linux的mmap一样但是只实现了addr是NULL的情况。因为ARM端通过mmap映射的是ARM端的内存RISCV端无法访问。所以本函数将ARM端用mmap映射的所有映射地址用数组存起来返回值是数组索引PKE可以用索引作参数调用另一个函数readmmap读取ARM端被映射的内存。
* `reg_t syscall_t::sys_munmap(reg_t num, reg_t length)`参数num的意义是之前调用mmap返回的索引本函数会将数组中对应索引储存的地址解映射。length是解映射的长度本函数要求这个长度和当时映射的长度相同否则解映射失败。返回值表示解映射是否成功小于零为失败。
* `reg_t syscall_t::sys_readmmap(reg_t num, reg_t offset, reg_t length, reg_t addr`如前所述本函数用来读取ARM端被映射的内存。参数num的意义是之前调用mmap返回的索引offset是读取位置和之前调用mmap映射的区域相比的偏移量length为读取的长度addr是指向RISCV端内存的物理地址返回值表示读取是否成功小于零为失败。
## 在PYNQ-Z2开发板上使用
### 直接下载二进制文件
如果PYNQ-Z2上ARM端运行的系统是[PYNQ官网](https://www.tul.com.tw/ProductsPYNQ-Z2.html)获得的**PYNQ v2.6启动镜像**且**没有升级过glibc**建议直接下载本仓库build文件夹下的两个文件libfesvr.so和riscv-fesvr。将libfesvr.so动态库放在开发板上的/usr/local/lib文件夹下riscv-fesvr程序放在开发板上的/home/xilinx~文件夹下。在开发板上运行pke
```
sudo riscv-fesvr riscv-pke 用户程序
```
### 编译
如果你使用的是其他操作系统或者升级过glibc又或者你喜欢编译可以自己编译这两个文件。因为本仓库实际编译出来的只有libfesvr.so这个库riscv-fesvr程序还需要其他的源代码所以具体的编译步骤是
1. 下载安装vivado如果PYNQ-Z2上ARM端运行的系统是[PYNQ官网](https://www.tul.com.tw/ProductsPYNQ-Z2.html)获得的**PYNQ v2.6启动镜像**且**没有升级过glibc**需要下载的vivado是2016.2版本的其他系统或标准库版本请自行尝试安装vivado时注意选对安装选项使得arm交叉编译器正确安装。
2. 克隆并进入本仓库,执行下列命令:
```
$ mkdir build
$ cd build
$ ../configure --host=arm-linux-gnueabihf
$ make libfesvr.so
```
3. 克隆并进入[fpga-pynq仓库](https://gitee.com/hustos/fpga-pynq)的usb-device-pynq分支如果仅需编译riscv-fesvr可以不递归克隆。执行
```
mkdir -p common/build
```
然后把刚才编译得到的libfesvr.so在仓库的build文件夹放入common文件夹build子文件夹中。进入pynq-z2文件夹运行
```
make riscv-fesvr
```
4. 编译结束后在common文件夹build子文件夹中找到libfesvr.so和riscv-fesvr。将libfesvr.so动态库放在开发板上的/usr/local/lib文件夹下riscv-fesvr程序放在开发板上的/home/xilinx~文件夹下。在开发板上运行pke
```
sudo riscv-fesvr riscv-pke 用户程序
```