找回密码
 注册
关于网站域名变更的通知
查看: 466|回复: 1
打印 上一主题 下一主题

小程序有几条语句不太懂。

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-2 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 cat12620 于 2019-9-2 15:29 编辑
: ]/ t& Z* V# P0 {
$ Y9 V+ w$ f/ T& x: a) Z2 |#include <stdio.h>
/ L$ M& f+ l0 l$ F3 J#include <unistd.h>
5 c* G# U) `" o2 O' u/ |1 I0 z; Q#include <fcntl.h>' m) b8 ]( |  C: |. Y
#include <sys/mman.h>
+ j0 O9 \7 p$ T$ N* Q5 D5 J8 m' Q#include "hwlib.h"0 z( N4 T; ~% C( V  _
#include "socal/socal.h") p7 K, l$ b5 K
#include "socal/hps.h"- d: Z7 g" U/ H. t( A8 A% O  x
#include "socal/alt_gpio.h"! g# k3 H& C, y- M
#include "hps_0.h"
+ o0 p4 J0 k3 d$ Y' f0 _2 i
" |( ~, u! g( X9 s- i+ _3 d#define HW_REGS_BASE ( ALT_STM_OFST )9 E( U. T/ j3 X: z+ I0 Z/ A
#define HW_REGS_SPAN ( 0x04000000 )" K; e% H8 C' T8 c9 o: G' j
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )
/ Q4 F: U$ R6 Q2 R8 e
& u. a" M' U) P1 l# g) \int main() {
, e9 }: y+ {* U
0 Q5 {! N0 n2 Q/ e* n4 R0 U; j        void *virtual_base;" D' p: ]  R/ q9 K
        int fd;! w" d. ]% c: B3 V
        int loop_count;, e6 E6 K4 F9 Y' D( p
        int led_direction;
4 Z* E! z+ G$ ~! p( n- l# U        int led_mask;7 ?0 h0 |8 e0 Z2 V5 m4 e! }, F
        void *h2p_lw_led_addr;
4 V# I5 h# M) V5 Y
- b  v, B  s) n; K! a; Z        // map the address space for the LED registers into user space so we can interact with them.2 [) e- ]/ c2 k. W( Q
        // we'll actually map in the entire CSR span of the HPS since we want to access various registers within that span7 B! |' \9 k. N5 U7 m) l! U! x# N

2 }4 E4 j7 |- O! |1 j1 g# s- N8 r        if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {" R7 }5 ^' k  K- j# P3 X
                printf( "ERROR: could not open \"/dev/mem\"...\n" );
+ _0 ], S' l( t; O' X                return( 1 );8 d: N9 X0 Z4 ?. e& d; J
        }" o2 D0 R: W/ X  c9 z
2 g$ u5 w5 F6 p7 o2 F6 [
        virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );
$ y: Z6 Y' Q/ \- \) a5 y% O$ K2 `0 o$ G4 J1 I
        if( virtual_base == MAP_FAILED ) {
% R+ h$ Y7 N2 C# A: p5 f: J                printf( "ERROR: mmap() failed...\n" );: K8 a" l" a( ]: f0 r# h4 I
                close( fd );0 Y8 w& E" X' u8 H5 T
                return( 1 );. m; q0 v- Z5 n' G& w, y( u
        }
# O+ [2 J0 w' R* N6 A, x; H7 i        / V$ G- s, h' |* z
        h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE ) & ( unsigned long)( HW_REGS_MASK ) );
& t6 o2 `6 n3 I8 L) o4 ~        
- a, G8 p5 ~: }0 \1 J
1 j& p( c4 H7 k* ]1 e        // toggle the LEDs a bit
8 n$ h$ \- _$ g  ]0 l& R
3 {# B1 u& P. @  `& J) M        loop_count = 0;* o# w9 w7 C- \( r  Z" t) ^$ }( C* F
        led_mask = 0x01;
2 ~/ a1 ~! y: a8 ^/ G2 `3 @        led_direction = 0; // 0: left to right direction+ [' u3 ]# m8 C' Q. S
        while( loop_count < 60 ) {* o2 r* t" E+ K) Z  y5 E0 _
               
& O- E' B6 h  k                // control led,  add ~ because the led is low-active& @/ G& |1 F5 m  r/ Q9 k( V
                *(uint32_t *)h2p_lw_led_addr = ~led_mask;
( l8 |* b0 P' U: w* D. e' t; F# y; q' T  m# b# h& J2 Y) K
                // wait 100ms
: v* u: l9 u9 @, D4 V; u+ n                usleep( 100*1000 );
. x+ ~. p% u5 l6 |$ U! l               
7 G$ [9 O9 A; R: a! @; {                // update led mask2 D9 Z. X  K; u* w+ ~  J) |. ]+ f
                if (led_direction == 0){
2 e2 ?+ Z( I3 t1 @! m                        led_mask <<= 1;' ?& |9 n0 ]; M' h  o& H9 i) o, z
                        if (led_mask == (0x01 << (PIO_LED_DATA_WIDTH-1)))$ j9 _, k* @# r! v( p. |7 H9 V
                                 led_direction = 1;
" V3 v/ a9 H; i/ Q% a                }else{
3 P- p' e8 b0 k% Z/ ?0 @9 R& O                        led_mask >>= 1;
/ {, J, A3 y" i5 x1 X                        if (led_mask == 0x01){ 1 i. p) F; u: l* n1 r" B
                                led_direction = 0;
% [6 s( H" X" D$ P7 S! B                                loop_count++;
7 w$ _2 W4 N5 ^                        }
; H% d9 [" O# V4 c                }8 e. e6 Y; j& I( {
                . d3 j5 G& T9 F5 _
        } // while
- b( r" T$ {* G  {8 o; Q        
6 G. U6 z+ P! X2 |8 G3 _& ]7 `  Q( h7 n  r9 ?! X4 @
        // clean up our memory mapping and exit. L6 n+ Q' Z: ]5 U4 v* k
        
; }# d$ A/ D% l        if( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) {
$ G) _; M6 j) y( F3 i# d1 m* F                printf( "ERROR: munmap() failed...\n" );# y+ ]! K3 G9 x' }' t
                close( fd );
$ a3 u  |1 d1 ]                return( 1 );7 ]+ l- y( B# ]; L9 p6 W$ T% a' W  W
        }
  o8 V. {0 z6 T8 M0 j) `+ [" d$ g2 J) Q! T: O
        close( fd );+ P. ^; {6 h! J# x+ R) G2 |

7 K( `7 Z5 P( L/ n        return( 0 );
! {4 _4 N9 D4 a0 w}
$ i4 m( S4 m+ @; S首先说h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE ) & ( unsigned long)( HW_REGS_MASK ) );,ALT_LWFPGASLVS_OFST 是什么?    ' Y& {9 `2 U# T9 T/ `

5 I4 h' w' j- B0 t' ?1 n8 E 我发现他的值是0xff200000,在<hps.h>头文件里。在qsys工程里面有一个Pio_led的元件,他相对于lwaxi的偏移地址被宏定义为PIO_LED_BASE,其值为0x0,( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE,这两个加起来是什么意思,为什么要加起来?) |9 y" m5 V5 ^4 O7 z

9 A: v% n% M, f' W6 w然后为什么又与 HW_REGS_MASK进行一个与?最开始的几个宏定义的值代表着什么意思? 在其中一个宏定义里面有用到ALT_STM_OFST,这个是什么?* i% e/ }3 C' E# U

3 f% [8 `: ^! z5 _: p" Q上面几个问题请教大神,非常感谢!

该用户从未签到

2#
发表于 2019-9-2 21:15 | 只看该作者
还以为是分享的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-18 20:40 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表