138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5537|回复: 1
打印 上一主题 下一主题

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( x3 y6 J0 _5 R; E& I# q. \( }' n! P2 l
问题描述:
; c) b2 m( G1 a, `在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 y0 c1 A1 n+ C6 r" O! l" _* k  P" O+ K0 A* u
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" c; _$ w. Q$ f7 w7 T- S
4 Z6 H0 O* q2 \9 S" Y% W* w
测试结果如下:
9 X' e/ y+ }1 x138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' Z( [  N8 E; E3 l+ g

, `  ^* z1 Y. h2 j# ]9 f
& e3 L8 i4 _8 ?8 g备注:
2 `/ y0 |9 ?9 u* a1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ P0 d# c( `8 \* K
2、相关代码如下:- A: W9 C( d: V! I6 p' M+ v
//UPP DMA缓冲大小512字节2 q6 T3 q* i3 Y4 V8 g( V
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 s7 @! f1 `0 v2 {  W#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
- ^, q; ^: N3 \# @. y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)' d! O/ }6 P  z1 z4 [' [9 L) t3 i
9 e/ U5 m2 A8 U

  P9 G; ^) ]7 c; T, U7 w//upp接收、发送buffer
2 j1 Z( M9 c$ h( ~#pragma DATA_ALIGN(upp_buffer_a, 8)
5 p& i/ T3 t/ g: |! ]  _5 z3 N#pragma DATA_ALIGN(upp_buffer_b, 8)( D4 g2 [  D7 {. C* k
' X: @/ f4 V5 s  w0 Z  y) C2 K
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ a# V$ W/ R' L) m2 q# i
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& f% J  j* q; b' T* b, b  J+ S
* x! q; V! M/ D. o# h% i
+ v; k& U; X( k7 i1 S/ e
static bool server_upp_data_recv(Server *server)
; p' c0 `2 M' x! }  f  V1 ~{
3 }5 s" |+ `* d1 p) z& h& z! q    if(server->upp_channel_a_recv == false) {' a% q6 d; c0 L* c& |
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");; u% M1 U4 R) m4 W
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- H# e& I- F# S" J- w
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# |! {0 R. I1 \0 T
; b9 u  B) @8 m

9 P+ E' {# c2 |0 ^            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 ~  `$ U7 b% c  S

. Z& a* L5 Q& L& |( G( k: H            server->upp_channel_a_recv = true;//
: h3 D9 Z/ q( C' f            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( y. c  ^; Z: S' L
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
* u# U% ~5 \9 k% i3 U            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 F* i) u2 H7 t: G' s  J% M5 b' H6 b  Y  g            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
, X$ R; t+ J) }. g# ~& ?4 s. c4 H9 d
5 f: X/ w  ~7 [6 g9 O            upp_error_count = 0;5 J8 v8 v; ]9 {) w
            upp_dmai_int_cut = 0;3 V% Y% t( ]$ q! }( J4 {0 s& @
# O+ b5 i( n5 u& h3 G
            // fill in data 4 h8 x$ c6 H% P- `: E
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 q- S* e! v: I5 {2 j1 S+ o: x
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");$ r8 d! e# @$ f* P3 O, B: v
        }
1 }+ O) R( z  N# j- a; r    }1 k' x- r  I. N# `
    else{- \! E" e# @, b% d& Q
        if (upp_dmai_int_cut > 0){9 N$ r9 ~/ G  G" D/ v, @4 ]
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( B( A$ a( Q4 j! U
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);0 m; {( B1 U: ~( O, s. I$ G3 d
9 Q/ M2 t  o% T
( U9 d" X: W7 ~! j- [( R2 P
            //copy data to upp_recv_list_busy
3 X7 h, D+ y1 g! I8 g4 ]$ T* _* L8 q: x            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* e7 W+ b) Q1 u! c7 U! E9 j! e
. A. ?' h0 r0 Z2 f* z
            //
, U; c6 ?6 U9 D6 [, a( H- m9 v7 U; B            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 F* M/ I& u8 B
( T- k, K4 J& j% \            //* u$ M! N; o! G$ z
            server->upp_channel_a_recv = false;//$ I2 Z- P$ E8 O& ?: K, ~

2 g& m/ t/ O( C0 ~& k            server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 h$ C! i! U3 U7 u
        }* k0 Z: V4 c. [3 |0 j
    }
1 F5 ?; t6 P; P
4 _( X9 T2 [! V/ }/ s" d: }! _6 f  ~4 O$ T9 p- q
    return true;; ^$ N3 Q0 z6 g
}
' ]' U4 N* m8 W0 H, }" i2 I! {# Z. p% E1 p% j
static bool server_upp_data_send(Server *server)1 P* O- [$ l1 T
{
1 h3 P- t* N# S" A. T' Z+ F    if(ListMP_empty(server->upp_send_list_busy) == FALSE){- l9 a% D. [; o, ~8 j4 n  b
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( ]* D0 q" f( p0 M- H4 }5 |, t        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);  Y& m% u; t, t% U+ N
        char tmp[128] ={0};1 H7 g& K3 s, o* W7 c  k' z

- a+ j# n! m# s1 U3 e- z8 T        server_msg_send(server, APP_CMD_LOG, "upp send: start");
: E% T) e' [) J0 v# \$ @0 `$ w- X9 W        print_log(server, data, 64);$ q+ T' H3 R4 v6 Y

# X. K, B/ t& t- t" R& {        //9 n* {% Z3 n( k/ T+ U
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" I9 ?0 N" P8 T4 Q, S$ [
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( N- L! b6 ]7 w4 Q( c1 [; q( N
        print_log(server, upp_buffer_b, 64);* Y0 X9 E3 c) l' B- J

: F5 e' F4 ]- V  v; y* K        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);+ S% N; r& J6 F7 \6 M) Q% X/ n. E
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
! x2 w0 ~( \, c7 P        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
# ]* B& ?6 c. W. f# h7 T* B. n        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
! \0 N& {4 C* ~+ E# I- S1 O: {" }$ m6 r
        memset(tmp, 0, sizeof(tmp));9 |3 P; q* u' l9 a
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 o: _5 U3 u) e  J4 U            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ z7 m" B% ], M# F$ y* h
        server_msg_send(server, APP_CMD_LOG, tmp);- w8 B2 d2 V( i0 l, S  l
" r, x6 I8 J+ Q
        upp_error_count = 0;2 m. O( j# J* p3 T+ ?. ]
        upp_dmaq_int_cut = 0;. Z1 h3 y7 H' ]: ?+ {8 w" M
        // fill in data
+ J( }% i0 ]6 t% e. r9 E        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# a; e: u$ ^' j3 P        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");( ~: a8 g2 k: D7 [8 J+ [' _. N
* F9 Y, H4 C2 p1 c: Q9 h6 a
        // wait send success
5 q7 c: D4 f9 c7 H) [        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * N3 k& E$ Q, x
9 I4 x# t" P1 w
        // make data node in free list ; [, _2 @/ N/ c6 }$ |. y; R9 c
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 d5 e1 {7 ~) Z
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) _& J7 u3 C% ^* \2 S    }
* P- N) ^% o( T' @  _3 \  Q$ N( t5 r    return true;
1 p: k% F- @$ W/ I- W2 s3 \}: g% w6 c2 y7 f) v/ r

. u5 Q2 \! d* f6 h' u' o
0 N& T0 E$ c8 V; c! `
7 r* k# ]3 a- Z( i, p

4 \4 o( M% p% o( ?$ Z  s
5 |! \1 |5 ]$ e! ]9 x" y) c) Z

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐; n2 M; B# ~, k* z1 {+ [$ Y" R

6 F! X4 N( S8 k9 ~/ b- j" J6 a- R

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-4-30 17:24 , Processed in 0.039480 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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