nios

发布时间 : 星期五 文章nios更新完毕开始阅读

#define IOWR_ALTERA_AVALON_TIMER_CONTROL(base, data) \\ IOWR(base, ALTERA_AVALON_TIMER_CONTROL_REG, data) #define ALTERA_AVALON_TIMER_CONTROL_ITO_MSK (0x1) #define ALTERA_AVALON_TIMER_CONTROL_ITO_OFST (0) #define ALTERA_AVALON_TIMER_CONTROL_CONT_MSK (0x2) #define ALTERA_AVALON_TIMER_CONTROL_CONT_OFST (1) #define ALTERA_AVALON_TIMER_CONTROL_START_MSK (0x4) #define ALTERA_AVALON_TIMER_CONTROL_START_OFST (2) #define ALTERA_AVALON_TIMER_CONTROL_STOP_MSK (0x8) #define ALTERA_AVALON_TIMER_CONTROL_STOP_OFST (3) /* PERIODL register */

#define ALTERA_AVALON_TIMER_PERIODL_REG 2

#define IOADDR_ALTERA_AVALON_TIMER_PERIODL(base) \\

__IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIODL_REG) #define IORD_ALTERA_AVALON_TIMER_PERIODL(base) \\ IORD(base, ALTERA_AVALON_TIMER_PERIODL_REG)

#define IOWR_ALTERA_AVALON_TIMER_PERIODL(base, data) \\ IOWR(base, ALTERA_AVALON_TIMER_PERIODL_REG, data) #define ALTERA_AVALON_TIMER_PERIODL_MSK (0xFFFF) #define ALTERA_AVALON_TIMER_PERIODL_OFST (0) /* PERIODH register */

#define ALTERA_AVALON_TIMER_PERIODH_REG 3

#define IOADDR_ALTERA_AVALON_TIMER_PERIODH(base) \\

__IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_PERIODH_REG) #define IORD_ALTERA_AVALON_TIMER_PERIODH(base) \\ IORD(base, ALTERA_AVALON_TIMER_PERIODH_REG)

#define IOWR_ALTERA_AVALON_TIMER_PERIODH(base, data) \\ IOWR(base, ALTERA_AVALON_TIMER_PERIODH_REG, data) #define ALTERA_AVALON_TIMER_PERIODH_MSK (0xFFFF) #define ALTERA_AVALON_TIMER_PERIODH_OFST (0) /* SNAPL register */

#define ALTERA_AVALON_TIMER_SNAPL_REG 4

#define IOADDR_ALTERA_AVALON_TIMER_SNAPL(base) \\

__IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAPL_REG) #define IORD_ALTERA_AVALON_TIMER_SNAPL(base) \\ IORD(base, ALTERA_AVALON_TIMER_SNAPL_REG)

#define IOWR_ALTERA_AVALON_TIMER_SNAPL(base, data) \\ IOWR(base, ALTERA_AVALON_TIMER_SNAPL_REG, data) #define ALTERA_AVALON_TIMER_SNAPL_MSK (0xFFFF) #define ALTERA_AVALON_TIMER_SNAPL_OFST (0) /* SNAPH register */

#define ALTERA_AVALON_TIMER_SNAPH_REG 5

#define IOADDR_ALTERA_AVALON_TIMER_SNAPH(base) \\

__IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_TIMER_SNAPH_REG)

#define IORD_ALTERA_AVALON_TIMER_SNAPH(base) \\ IORD(base, ALTERA_AVALON_TIMER_SNAPH_REG)

#define IOWR_ALTERA_AVALON_TIMER_SNAPH(base, data) \\ IOWR(base, ALTERA_AVALON_TIMER_SNAPH_REG, data) #define ALTERA_AVALON_TIMER_SNAPH_MSK (0xFFFF) #define ALTERA_AVALON_TIMER_SNAPH_OFST (0) #endif /* __ALTERA_AVALON_TIMER_REGS_H__ */

NIOS II DMA

NIOS DMA同样是Altera SOPC Builder库组件

DMA可用于存储器之间、存储器与外设、外设之间的数据传输,允许没有CPU干预,完成固定长度或者可变长度的数据传输

DMA外设通过两个Avalon主端口(一读一写)和一从端口控制。 典型DMA传递过程如下:

1。通过写控制端口设置DMA的数据传输方式 2。启动DMA外设,实施数据传输(CPU不干预)

3。DMA读传输主端口从目标地址(内存或者外设)读取数据,写端口向目的地址(内存或者外设)写数据。读写之间通过FIFO进行数据缓冲。

4。只指定字节数的数据传输完成或者传输了一个包结束(EOP)时,DMA将结束传输。DMA外设可以在传输结束时发出中断请求。

5。传输当中或者结束后,都可以通过查看DMA的状态寄存器来判断传输在进行还是已经结束 主要寄存器: status 第0位:done 第1位:busy

第2位:reop(读取当前数据包结束) 第3位:weop(写当前数据包结束)

第4位:len(完成一次DMA传输,len置1)

readaddress(主读取起始地址),存放的是传输数据的源地址,其宽度由用户在SOPC中自己定义。(与外设匹配)

writeaddress(主写入起始地址),与上类似

length ,存放读写端口之间需要传输的字节数,长度寄存器宽度由系统生成时的设置决定,DMA每完成一次写传输,length寄存器值减一,当减为0时,len位使能。其寄存器的值按照字节数计算,双字传输,必须是4的倍数,字的传输,当然是2的倍数啦!! control 寄存器: 位0: byte 字节传输 位1: hw 字传输 位2: word 双字传输 位3: go DMA 使能 位4: i_en 中断使能 位5:reen 读数据包使能 位6:ween写数据包使能

位7:leen ,置1时,DMA在传输完length数目数据的时候结束传输(已经知道传输数据量),若设置0,则不会停止,使用于数据量不确定的场合。 位8:rcon 从固定地址读取 位9:wcon 从固定地址写入

读数据的地址每次访问递增1.2.4个字节,具体是几取决去传输的是字节、字、或者半字,若rcon置1,则地址不递增。

当done&&i_en == 1时候,dma向外设发出中断请求,典型的中断处理程序首先读取状态寄存器的len,reop,weop位来判断中断原因。然后,写转台寄存器清除中断,处理后,进行下一次DMA传输。

NIOS II常用函数详解 IO操作函数

函数原型:IORD(BASE, REGNUM)

输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量

函数说明:从基地址为BASE的设备中读取寄存器中偏移量为REGNUM的单元里面的值。寄存器的值在地址总线的范围之内。 返回值: -

函数原型:IOWR(BASE, REGNUM, DATA)

输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据 函数说明:往偏移量为REGNUM寄存器中写入数据。寄存器的值在地址总线的范围之内。 返回值: -

函数原型:IORD_32DIRECT(BASE, OFFSET)

输入参数:BASE为寄存器的基地址,OFFSET为寄存器的的偏移量 函数说明:从地址位置为BASE+OFFSET的寄存器中直接读取32Bit的数据 返回值: -

函数原型:IORD_16DIRECT(BASE, OFFSET)

输入参数:BASE为寄存器的基地址,OFFSET为寄存器的的偏移量 函数说明:从地址位置为BASE+OFFSET的寄存器中直接读取16Bit的数据 返回值: -

函数原型:IORD_8DIRECT(BASE, OFFSET)

输入参数:BASE为寄存器的基地址,OFFSET为寄存器的的偏移量 函数说明:从地址位置为BASE+OFFSET的寄存器中直接读取8Bit的数据 返回值: -

函数原型:IOWR_32DIRECT(BASE, OFFSET, DATA)

输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据 函数说明:往地址位置为BASE+OFFSET的寄存器中直接写入32Bit的数据 返回值: -

函数原型:IOWR_16DIRECT(BASE, OFFSET, DATA)

输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据 函数说明:往地址位置为BASE+OFFSET的寄存器中直接写入16Bit的数据 返回值: -

函数原型:IOWR_8DIRECT(BASE, OFFSET, DATA)

输入参数:BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据 函数说明:往地址位置为BASE+OFFSET的寄存器中直接写入8Bit的数据 返回值: - Dma:

函数原型:int alt_dma_rxchan_close (alt_dma_rxchan rxchan)

输入参数:rxchan为接收信道

函数说明:函数 alt_dma_rxchan_close ()通知系统:应用程序已经完成DMA 接收信道rxchan,目前执行是成功的 返回值: 成功返回为0,反之为-1

函数原型:alt_dma_rxchan_depth(alt_dma_rxchan dma) 输入参数:dma

函数说明:函数alt_dma_rxchan_depth ()返回传送到特别DMA的最大数量(深度)的接收请求 返回值: DMA的最大数量

函数原型:int alt_dma_rxchan_ioctl (alt_dma_rxchan dma, int req, void* arg) 输入参数:dma直接存储器名, req为请求操作的列举, arg由请求决定 函数说明:通过DMA接收信道执行设备的具体I/O操作 返回值: 成功返回请求具体值,反之返回为负数 请求类型

请求类型 请求类型说明

ALT_DMA_SET_MODE_8 传输以8Bit为单位的数据,arg值忽略 ALT_DMA_SET_MODE_16 传输以16Bit为单位的数据,arg值忽略 ALT_DMA_SET_MODE_32 传输以32Bit为单位的数据,arg值忽略 ALT_DMA_SET_MODE_64 传输以64Bit为单位的数据,arg值忽略 ALT_DMA_SET_MODE_128 传输以128Bit为单位的数据,arg值忽略 ALT_DMA_TX_ONLY_ON (1) 软件控制下只能发送

ALT_DMA_TX_ONLY_OFF (1) 自定义模式,软件控制下可以接收,发送 ALT_DMA_RX_ONLY_ON (1) 软件控制下只能接收

ALT_DMA_RX_ONLY_OFF (1) 自定义模式,软件控制下可以接收,发送 函数原型:alt_dma_rxchan alt_dma_rxchan_open (const char* name) 输入参数:name为常数字符指针,如/dev/dma_0

函数说明:为DMA接收信道获得一个alt_dma_rxchan描述符 返回值: 成功返回非0,反之返回为0

函数原型:int alt_dma_rxchan_prepare (alt_dma_rxchan dma, void* data, alt_u32 length, alt_rxchan_done * done, void* handle)

输入参数:dma使用的信道;data接收数据位置的指针;length最大的接收数据长度;done一旦数据被接收,调用返回函数;handle,非透明值传到done 函数说明:发送一个接收请求到DMA接收信道, 返回值: 成功返回0,反之返回为负数

函数原型:int alt_dma_rxchan_reg (alt_dma_rxchan_dev * dev) 输入参数:dev接收信道设备名 函数说明:给系统寄存DMA接收信道 返回值: 成功返回0,反之返回为负数

函数原型:int alt_dma_txchan_close (alt_dma_txchan txchan) 输入参数:txchan发送信道名

函数说明:通知系统:应用程序已经完成DMA发送信道txchan 返回值: 成功返回0,反之返回为负数

函数原型:int alt_dma_txchan_ioctl (alt_dma_txchan dma, int req, void* arg)

输入参数:dma直接存储器名;req为请求操作的列举;arg请求的额外参数,由请求决定

联系合同范文客服:xxxxx#qq.com(#替换为@)