1烧录SD卡
镜像文件
F:/1.DE1-SOC/TMP/1.event/bak/DE1_SoC_UBUNTU.img
工具:4.Win32DiskImager-0.9.5-install.exe
SD卡格式化需要专用SD卡格式。
2系统启动连接网络
查看板卡和电脑信息:uname –a
内核版本:cat/proc/version
发行版本:cat /etc/issue
查看CPU信息:cat/proc/cpuinfo
apt-getupdate
ip
3.安装:ssh服务端
sudo apt-get install openssh-server
增加系统密码:sudo passwdroot
Window登入操作
4.下载源码安装lighttpd
建立临时目录:
wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.39.tar.gz
tar-zxvf lighttpd-1.4.39.tar.gz
./configure报错
Ø 报错:newly createdfile is older than distributed files!
apt-get install ntpdate
Ø 缺少pcre
sudoapt-get install libpcre3 libpcre3-dev
Ø 缺少zlib
zlib-headers and/orlibs where not found, install them or build with --without-zlib
sudo apt-get installzlib1g-dev
Ø 缺少bzip2
bzip2-headersand/or libs where not found, install them or build with --without-bzip2
sudoapt-get install libbz2-dev
执行成功
指定安装目录很重要:./configure–prefix=/lighttpd
5.make
Ok
6.make install
安装目录为/usr/local
7.建立文件夹和修改配置文件
启动lighttpd时报错(server.c.755) I will not set uid to 0
关闭配置文件中的
server.username
server.groupname
make install后的安装文件需要在编译时设置单独的文件夹,卸载可以直接删除文件即可,如果编译安装到了类似usr的地方,没有特别的办法删除干净
源码提供:makeuninstall/distclean/veryclean
https://www.cnblogs.com/x_wukong/p/4486412.html
建立简单CGI交互功能页面demo
Web页面编写程序,调用cgi程序得到计算结果并返回。
./lighttpd -f ../config/lighttpd.conf
killall lighttpd
8.上传文件
http://blog.csdn.net/edmond999/article/details/52994310
对lighttpd的详细配置参数
9.编译打包安装包文件
Make dist可以打包安装包
10.权限模块使用
更改所有权限为root
chown root:root /lighttpd/ -R
http://hlee.iteye.com/blog/549981
11.Qsys系统搭建编译
C:\Altera_TRAN\SW\de1_soc_lab3_hardware
/*
* Macros for device 'PIO_IP', class'altera_avalon_pio'
* The macros are prefixed with 'PIO_IP_'.
* The prefix is the slave descriptor.
*/
#definePIO_IP_COMPONENT_TYPE altera_avalon_pio
#definePIO_IP_COMPONENT_NAME PIO_IP
#definePIO_IP_BASE 0xc0
#definePIO_IP_SPAN 32
#definePIO_IP_END 0xdf
#definePIO_IP_IRQ 1
#definePIO_IP_BIT_CLEARING_EDGE_REGISTER 0
#definePIO_IP_BIT_MODIFYING_OUTPUT_REGISTER 0
#definePIO_IP_CAPTURE 0
#definePIO_IP_DATA_WIDTH 16
#definePIO_IP_DO_TEST_BENCH_WIRING 0
#definePIO_IP_DRIVEN_SIM_VALUE 0
#definePIO_IP_EDGE_TYPE NONE
#definePIO_IP_FREQ 50000000
#define PIO_IP_HAS_IN1
#definePIO_IP_HAS_OUT 1
#definePIO_IP_HAS_TRI 0
#definePIO_IP_IRQ_TYPE LEVEL
#definePIO_IP_RESET_VALUE 1023
12编译内核
1.如何在Ubnutu中配置使用git
http://blog.sciencenet.cn/blog-858128-1060316.html
2.使用git clone
http://blog.csdn.net/u013519290/article/details/52279164
https://www.cnblogs.com/duwanjiang/p/5921167.html
3.加速git
https://www.cnblogs.com/dakewei/archive/2017/08/31/7461069.html
4.git库文件
https://github.com/thinkoco/linux-socfpga
1. 下载源码
地址:https://github.com/terasic/linux-socfpga
git clone https://github.com/thinkoco/linux-socfpga.git
2. 解压unzip linux-socfpga-master.zip
3. 配置环境变量
修改/etc/bash.brc的内容
export ARCH=arm
exportCROSS_COMPILE=/root/gcc-linaro-arm-linux-gnueabihf-4.8-2013.12_linux/bin/arm-linux-gnueabihf-
export LOADADDR=0x8000
4. 编译
make ARCH=arm socfpga_defconfig
make menuconfig(可选)配置 可配置界面
make ARCH=arm zImage LOADADDR=0x8000
make zImage 或者make uImage
5. 编译dtb
make socfpga_cyclone5.dtb
make dtbs
编译后生成路径 uImage 工作目录/linux-socfpga/arch/arm/boot
dtb 工作目录/linux-socfpga/arch/arm/boot/dts
编译ubuntu 内核的.config备份为.config_ubuntu在源文件下可用命令
Cp .config_ubuntu .config还原为配置
Ubuntu镜像需要EXT4分区格式支持.config_ubuntu中已经添加该文件系统的izhi
1. 加速git clone
安装PIP
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-setuptools m2crypto
安装shadowsocks
pip installshadowsocks
https://www.sundabao.com/ubuntu%E4%BD%BF%E7%94%A8shadowsocks/
sslocal -c /home/test/shadowsocks.json
2. git加速配置
https://www.jianshu.com/p/3ed14ca653a1
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
关闭
git config --global --unset http.proxy
git config --global --unset https.proxy
13.理解dtb
文件中文件目录
uImage:系统镜像文件
理解dtb,先要理解Device Tree
Linux中arch/arm中虫棉很plat和mach类的大量垃圾代码,大部分都只是在扫描板级细节,但是对内核来说不过是垃圾。
Device Tree是一种描述硬件的数据结构,Linux2.6以后引进,通过DT硬件细节可以直接透过传递给Linux,不需要kernel进行大量冗余编码。
DeviceTree由节点(node)和属性(property)组成,成对出现的name和value。
CPU数量种类
内存基地址大小
总线和桥
外设连接
中断控制器和中断使用情况
GPIO控制器和GPIO使用情况
Clock控制器和clock使用情况
基本就是描述电路板上CPU、总线、设备组成的树,通过bootloader传递给内核,然后内核识别,并展开出Linux内核platform_device、I2c_client、spi_device等设备。设备用到的内存、IRQ等资源,被传递给内核,内核会将这些资源绑定给展开的相应设备。
Device Tree组成和结构
增加用于描述设备硬件信息的文本格式,还增加编译这一文本的工具,同时boodloader也需要支持将编译后的Device Tree传递给Linux内核。
DTS(device tree source)
在ARM Linux中,一个dts对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录中,由于SoC可能对应多个machine(一个SoC可以对应多个产品和电路板)这些.dts文件包含许多共同的部分,Linux内核简化原则,把SoC公用部分或者多个machine共同的一部分提炼为.dtsi,类似与C的头文件,其他machine的.dts可以包含.dtsi,对于VEXPRESS而言,vexpress-v2m.dtsi被包含vexpress-v2p-ca9.dts引用。
所有ARM SoC都的dtsi都引用了skeleton.dtsi。
具体的理解参照文档
DTC(device tree compiler)
将.dts编译为.dtb的工具。DTC的源码位于内核的scripts/dtc目录,在Linux内核使能Device Tree的情况下,编译内核的时候主机工具dtc会被编译出来,对应scripts/dtc/Makefile中的“hostprogs-y = dtc”
Device Tree Blob(.dtb)
.dtb是.dts被DTC编译后的二进制格式的DeviceTree描述,由Linux内核解析。通常在制作NAND、SD启动image时,会为.dtb文件单独留下一个很小的区域以存放,之后bootloader在引导kernel的过程中,会先读取.dtb到内存。
Binding
对于Device Tree中的结点和属性具体是如何描述设备的硬件细节,一般需要文档来讲解,.txt,位于Documentation/device/bingding
Bootloader
Uboot mainline 从V1.1.3开始支持DeviceTree,其对ARM支持这是和ARM内核支持Device Tree同期完成
为了使能DeviceTree 需要编译Uboot时在config文件中加入
#define CONFIG_OF_LIBFDT
DE1_SoC的FPGA PIO向HPS发送中断
1.安装Fast CGI
Apt-get install libfcgi-dev
2.配置Fcgi
https://www.douban.com/note/521728577/
测试CPU内存占用率
http://www.blogjava.net/daniel-tu/archive/2008/12/29/248883.html
同时理由CGI与FastCGI方式实现CGI程序加载,然后通过并发访问(每s/100次)资源占用率分析
并发量(次) | 时间(s) | 成功率 | 数据传输总量 | CPU占用率 | 内存 |
10 |
|
|
|
|
|
50 |
|
|
|
|
|
100 |
|
|
|
|
|
200 |
|
|
|
|
|
400 |
|
|
|
|
|
500 |
|
|
|
|
|
自定义IP核解析
异构模式下总线级交互(总线+IP核)
3.1
IP核有公开IP核,能够满足日常应用需求,
但是在某些情况下,什么场景,常规IP核不能满足要求,所以需要定制私有IP核,
主要
1.总线传输时序,(AXI和Avalon总线传输时序不能匹配)
2.典型硬件的控制逻辑设计(七段数码管为例)
3.逻辑如何与AXI总线相连。
4.具体的实现
CPU挂载在Avalon BUS上,要想让七段数码管被CPU控制,需要写一个controller控制器挂载在AvalonBUS上。
SEG Controller如何挂载在AvalonBUS上,Altera在AvalonInterface Specification中定义了各种interface,只要将controller做这些接口就能与Avalon BUS总线相连,各种接口各具特色。由于七段数码管是个慢速装置,功能场景主要是受CPU的master控制,因此选择了Avalon—MM Slave interface。
在Avalon-MM的世界中,主要分Master Interface與Slave Interface,簡單的說,Master能夠自己發起傳輸,Slave則必須由Master控制而被動的發起傳輸,在Lab 2中,SEG7 Controller是由Nios II CPU這個master所控制,而不能主動發起傳輸,所以用的是Slave Interface。
一个典型IP核的目录结构,外层inc为register map,由macro构成,直接存取硬体
HAL的inc,放的是headerfiles,src放的是HAL的source code。
外层的inc可以不用
在开始开发IP核驱动时,需要了解Avalon-MM Slave Interface Spec以及其timing是如何運作。
(1)第一个周期在CLK上升沿开始
(2)Avalon Bus发出有效address、byteenable、write、writedata信号
(3)Slave IP在CLK上升沿捕获address、byteenable、write、writedata。整个传输在1个clk完成,下一个clk可以发起另一次传输。
一个Avalon-MM Slave Transfer最少必须包含
CLK、address、byteenable、write、writedata,并且在一个CLK内完成。
由于我们配置CPU的32bit databus,七段数码管也采用32bit传输,可以忽略byteenable信号,当忽略byteenable信号时,32bit全部enable,只剩下clk、address、write、writedata四个信号。
在quartus之后建议将clk与rset独立出来成clock interface,所以原来Avalon-MM slave interface剩下 address、write、writedata。
命名规范
模块接口定义:
parameter DATA_WIDTH =32; // data bus width
31 parameter SEG7_NUM = 8; // specify the number of seg7 unit
32 parameter ADDR_WIDTH = 3; // log2(SEG7_NUM)
33
34 reg [SEG7_NUM-1:0] base_index;
35 reg [DATA_WIDTH-1:0] write_data;
36 reg [(SEG7_NUM*8-1):0]reg_file;
37
module SEG7_Controller (
// Avalon clock interface siganals
input csi_clockreset_clk,
input csi_clockreset_reset_n,
// Signals for Avalon-MM slave port
input [ADDR_WIDTH-1:0] avs_s1_address,
input avs_s1_write,
input [DATA_WIDTH-1:0] avs_s1_writedata,
// user logic inputs and outputs
output [SEG7_NUM*8-1:0] avs_s1_export_oHEX
);
avs_s1_export_oHEX是要与 topmodule DE2.v想接。
对三种Bridge的访问在物理上都是由相应的Axi接口完成,由于Qsys中自动将Avalon总线转化为axi总线的机制,所以在自定义IP中,使用Avalon总线即可。
重点要掌握好的信号一个是waitrequest,另一个是readdatavalid。在任何传输方式中,当总线给出的waitrequest信号有效时,要发起读写的主/从设备应当保持输出的地址信号、读写信号、写数据时的数据信号以及在burst传输中的burstcount信号有效,直到waitrequest信号为低,表明目标设备已经接收请求,然后方可发起下一次传输。
当作为Avalon总线的Slave时,上图中的控制信号、地址信号都为输入,另外还会有一个ChipSlect信号。当有设备发出对该设备的read/write请求时,ChipSlect信号有效,同时addres为从设备的寄存器地址。例如该设备基址为0x0100,有两个32位寄存器,那么当某主设备发出地址0x0104选中该设备时,ChipSelect有效,同时从设备收到的Address为1(在该例中地址以words为单位)。
https://www.cnblogs.com/blinkingstar/p/4299022.html
Avalon-MM的一般时序图
IP逻辑实现
当作为Avalon总线的Slave时
3.2
系统级驱动实现