77 lines
4.3 KiB
Markdown
77 lines
4.3 KiB
Markdown
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 用户程序
|
||
```
|