打印
[FPGA]

这个小程序的有几条语句是什么意思

[复制链接]
1600|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuyuhua123|  楼主 | 2015-11-21 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "hwlib.h"
#include "socal/socal.h"
#include "socal/hps.h"
#include "socal/alt_gpio.h"
#include "hps_0.h"

#define HW_REGS_BASE ( ALT_STM_OFST )
#define HW_REGS_SPAN ( 0x04000000 )
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )

int main() {

        void *virtual_base;
        int fd;
        int loop_count;
        int led_direction;
        int led_mask;
        void *h2p_lw_led_addr;

        // map the address space for the LED registers into user space so we can interact with them.
        // we'll actually map in the entire CSR span of the HPS since we want to access various registers within that span

        if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
                printf( "ERROR: could not open \"/dev/mem\"...\n" );
                return( 1 );
        }

        virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );

        if( virtual_base == MAP_FAILED ) {
                printf( "ERROR: mmap() failed...\n" );
                close( fd );
                return( 1 );
        }
       
        h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE ) & ( unsigned long)( HW_REGS_MASK ) );
       

        // toggle the LEDs a bit

        loop_count = 0;
        led_mask = 0x01;
        led_direction = 0; // 0: left to right direction
        while( loop_count < 60 ) {
               
                // control led,  add ~ because the led is low-active
                *(uint32_t *)h2p_lw_led_addr = ~led_mask;

                // wait 100ms
                usleep( 100*1000 );
               
                // update led mask
                if (led_direction == 0){
                        led_mask <<= 1;
                        if (led_mask == (0x01 << (PIO_LED_DATA_WIDTH-1)))
                                 led_direction = 1;
                }else{
                        led_mask >>= 1;
                        if (led_mask == 0x01){
                                led_direction = 0;
                                loop_count++;
                        }
                }
               
        } // while
       

        // clean up our memory mapping and exit
       
        if( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) {
                printf( "ERROR: munmap() failed...\n" );
                close( fd );
                return( 1 );
        }

        close( fd );

        return( 0 );
}
首先说h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE ) & ( unsigned long)( HW_REGS_MASK ) );,ALT_LWFPGASLVS_OFST 是什么?     我发现他的值是0xff200000,在<hps.h>头文件里。在qsys工程里面有一个Pio_led的元件,他相对于lwaxi的偏移地址被宏定义为PIO_LED_BASE,其值为0x0,( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE,这两个加起来是什么意思,为什么要加起来?然后为什么又与 HW_REGS_MASK进行一个与?最开始的几个宏定义的值代表着什么意思? 在其中一个宏定义里面有用到ALT_STM_OFST,这个是什么?

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝