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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 cat12620 于 2019-9-2 15:29 编辑 - z8 {: o5 s; P

  W  U; r' |6 C# f#include <stdio.h>9 _1 q6 ~% J, ]' ^  |- B3 T: G
#include <unistd.h>$ Y1 I/ h, [- v1 J7 m; O
#include <fcntl.h>( C& m) @# Z' S% N' ]6 Q
#include <sys/mman.h>
' q7 B1 T0 O$ {: r  U( u#include "hwlib.h"/ o) `. b5 j9 S/ Q; y6 I
#include "socal/socal.h"9 _& G: z+ r$ A$ q7 A
#include "socal/hps.h"
( g2 ^% m, {3 x2 z* N9 k#include "socal/alt_gpio.h"
/ P' z0 S4 n7 @, [( h#include "hps_0.h"
  V! {, B$ }- ]2 x: K' h1 Z8 y% @9 Y0 F1 h8 {$ S/ V" c
#define HW_REGS_BASE ( ALT_STM_OFST )* O- y% {+ I9 w0 o( B1 ~# b
#define HW_REGS_SPAN ( 0x04000000 )
" i" d; A; M# C& w#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )
( q# `' d: u0 K5 g0 ^; s% q1 z% Y$ x
int main() {
3 o9 o* X* [# [  }! a
  x% s7 `8 |& t9 x% P        void *virtual_base;
9 _* I+ L5 I  L/ V0 B, Z  N9 V; \4 U        int fd;6 N& ~* c4 W+ Y) {& J5 U% D
        int loop_count;3 J! ?0 U/ d- i8 Q4 D
        int led_direction;9 O4 d7 R7 P3 B$ r) M4 [7 B
        int led_mask;4 E) G- x) _- B* v4 W
        void *h2p_lw_led_addr;
' ]+ Q' ?- b7 }% F$ H4 f
4 D8 ]/ B- B0 d8 B        // map the address space for the LED registers into user space so we can interact with them.
1 }- P' s# _( E( a        // we'll actually map in the entire CSR span of the HPS since we want to access various registers within that span
5 t* Z7 T: L4 q; [* \/ h
' ?6 P9 ]0 Y2 J1 x        if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
) P- Y- I- d( Q* Z                printf( "ERROR: could not open \"/dev/mem\"...\n" );
4 g% Y3 V* J: @. h$ [9 R* K: l                return( 1 );
- R0 n) o# R  g# v( e        }0 l! K0 I8 @2 t5 w& }1 ]5 V
" m( i; S- ]/ A" d2 S
        virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );
6 Z" X1 d/ X- J( j7 G1 W& h3 C5 A& E  l
        if( virtual_base == MAP_FAILED ) {
! L2 p: ^' Q; n( w) j; o                printf( "ERROR: mmap() failed...\n" );
1 b" A6 ^  t% A" M0 q8 ?, W                close( fd );$ U# M2 h1 b: C$ m( o
                return( 1 );
* k: \; f# v* b( \) a, `  E        }$ V1 O' K/ w5 s4 P! |
        
' @4 t9 X# U# h) {; F. m        h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE ) & ( unsigned long)( HW_REGS_MASK ) );# V4 v( U7 m+ L2 q
        ) S2 g( ]* j% A0 X+ Z7 ?' s% J! T5 t

( I' x) M" }  d0 S        // toggle the LEDs a bit
- z$ s1 c5 O# n4 U& A# z4 u8 e% p; z; h; x( j$ q
        loop_count = 0;
9 D) i& d5 p; r( x* d% H        led_mask = 0x01;
/ _/ b$ G4 ?; p; b$ J        led_direction = 0; // 0: left to right direction& x- W: N; x/ {' d+ o/ }0 K
        while( loop_count < 60 ) {: Z9 r1 _* }. A  r8 y
               
* C4 B# c" N# Z& {                // control led,  add ~ because the led is low-active
( c4 I" }' L! U+ c& C                *(uint32_t *)h2p_lw_led_addr = ~led_mask; 4 M$ t- B: M1 H, W( ?4 d8 G  J1 E8 d

* x# K, u# Y7 U5 l' Z* A                // wait 100ms
- _, _% u6 E) u) j4 S% {  M                usleep( 100*1000 );7 C4 X; p9 S$ |. r; t
                ; b2 `$ t! Y$ H0 `8 z6 s7 C! a1 R
                // update led mask2 u, N& V# R$ _2 A
                if (led_direction == 0){& n4 g& _0 e3 Y/ D7 _: Y
                        led_mask <<= 1;
$ \5 d) T. j+ W0 o* Q4 b5 Z                        if (led_mask == (0x01 << (PIO_LED_DATA_WIDTH-1)))
0 U9 M$ S2 d& k8 e                                 led_direction = 1;/ ^4 C8 A3 T: q+ ]
                }else{
/ e8 r# z: j* ^$ r$ G- q" L! n                        led_mask >>= 1;8 N* ?: m) o7 _9 ?1 [
                        if (led_mask == 0x01){
# J; K3 W9 ^' b7 O% t; \                                led_direction = 0;
. ~' x9 l/ W  U) g                                loop_count++;
+ I+ H& |- N' V, A6 |9 n( V5 ]* S# L1 A                        }- i; c) z% C( }/ w7 z( w2 O
                }
' Q" D# x( I# `  |8 E                7 `* w4 q" H( F
        } // while
7 \5 N- ^- u6 _% p2 ~- T        5 U/ N4 G' X4 l1 |

/ m3 t# G+ `, ~* m        // clean up our memory mapping and exit
7 R5 m" b$ G: T, E        % g3 `( n2 p" Z  o: h5 Y4 H. n2 k* M& p
        if( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) {0 W- b  f: v+ F8 K) @8 y
                printf( "ERROR: munmap() failed...\n" );
( a8 S3 j" a0 P% r  o5 y8 d                close( fd );
" ?4 @8 A9 k- K2 r) l/ k* z2 S                return( 1 );
. A$ f. n  {) r1 {  i" n; v, I. R: n        }/ T& i" X' y. o6 a
# {! \$ Y- I! i! Q% x1 D
        close( fd );& B7 H% l: R, B( T5 f# ~4 [

- i: v; G1 T" C! L        return( 0 );2 f% g$ _- Y5 _% G
}2 Q" ^; r/ z- X! z! A
首先说h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE ) & ( unsigned long)( HW_REGS_MASK ) );,ALT_LWFPGASLVS_OFST 是什么?   
) N  t/ B% m+ A. G$ h0 v1 G! O' G2 `- g6 r2 R0 I, ?4 K
我发现他的值是0xff200000,在<hps.h>头文件里。在qsys工程里面有一个Pio_led的元件,他相对于lwaxi的偏移地址被宏定义为PIO_LED_BASE,其值为0x0,( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE,这两个加起来是什么意思,为什么要加起来?3 J) I9 e2 f! E) [& p

$ ?. H! H; L6 `3 C" E: K7 W$ p0 Y  {然后为什么又与 HW_REGS_MASK进行一个与?最开始的几个宏定义的值代表着什么意思? 在其中一个宏定义里面有用到ALT_STM_OFST,这个是什么?
+ V" f9 B5 f. }# p) [$ \
9 I% ^0 Z6 X, X0 [+ W, E, P上面几个问题请教大神,非常感谢!

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-13 01:17 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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