138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 X. V) W, N7 z3 R) [9 |& B

6 v+ y/ [5 |  U' @  Q问题描述:) u" L( W2 H  w  q6 k/ X  w
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& U: B, F& c1 v- }" H
- \6 R7 {' I+ }! v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' b! S/ b+ ?1 N! ~9 o9 i% [
$ z6 A$ l/ v8 H) g5 w- L: [! D
测试结果如下:
- L+ V3 V6 y( |; ~! D7 x4 T) T138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, u( v4 Q; R4 [2 _' p

5 ~$ }0 ^3 E# ]
& U/ B: Y5 e7 ~. x3 e, q0 y备注:
# k) O% q# i5 }, t1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ i3 y4 F  C0 N# Z5 P
2、相关代码如下:
+ _- f; K1 C6 u# l0 C+ B! G3 w//UPP DMA缓冲大小512字节6 B$ p! J# R4 r7 n! W
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 a+ j- ~" N9 m2 s% ?* q( N; t* ^#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ I) d8 |, @/ n/ D#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
) {* v0 a, G. ^( g
* n% L$ X, x3 I& M
7 ~0 j% y- z& j' q+ d/ r" q. s& Z//upp接收、发送buffer
% i) d+ e5 y4 |#pragma DATA_ALIGN(upp_buffer_a, 8)
! l1 x' I/ m1 M#pragma DATA_ALIGN(upp_buffer_b, 8)
) g; c+ p  R( Q7 s9 H' ~: z4 p: _" g# T1 y2 b% A& p
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 [! z8 k: h+ [. d0 d
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" i4 M$ e3 Q9 G' _9 W1 |
) N' C8 W( T( I* k/ j# F1 [3 R
9 D7 {- i" \9 U# K3 H% Z/ Z$ B2 _static bool server_upp_data_recv(Server *server)
* G8 ~! Q. Q% F5 u1 a: N; v# L{
7 G) B# H4 p% v+ y+ i! e    if(server->upp_channel_a_recv == false) {
- Q* J- ?- R; i4 }/ F- D. u! V        server_msg_send(server, APP_CMD_LOG, "upp recv: start");, \# A8 `# l) J' ?9 G: H. w' }
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 H7 v( f- ~( [' t* ^( B: R8 b
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* k! T% ?! i$ @) i/ ^/ [, _" h

1 m3 c2 f, q3 z
, J. q. ^! ?3 k4 A4 S            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- D$ Z+ J" e& v, z( h7 S# j8 }

) F7 @* v( k* a: H  `; {5 I1 i& c            server->upp_channel_a_recv = true;//* O7 D6 i, Z2 K. Y; d$ G0 A
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
7 d* B) a! I( P% J* v/ n! B4 Z            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;  m  I$ v5 u+ U6 S& W  n! @
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
% K. J& b( Q, _/ d# U4 C; @            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. ]6 {3 C- A4 D+ t+ ^! p, I. [: @3 W9 C  r5 t0 F; x
            upp_error_count = 0;
& `2 M$ E  m7 F. v, |/ Q. q            upp_dmai_int_cut = 0;
7 Y/ R$ q. W1 _  f: K! q0 _# J7 U, h: P! [
            // fill in data
* H# ~3 t4 q6 O# G7 y: r$ z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 _3 \& q$ }0 f5 g" ^9 s6 |# E8 [
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- V+ v0 H/ C9 l0 \& A, D) g4 B
        }0 U  O1 E0 S. L4 g- I" h
    }
$ b7 @0 m/ R- J. Q' i: G    else{
8 ^6 E6 n( i: c" a& C        if (upp_dmai_int_cut > 0){6 S  C! W: k! r' B5 D
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ G2 g  U0 z8 w; ]8 [0 p: J/ M
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: b: G5 o3 m: T6 s; Z; k$ N  s" D: {( i
! F7 l  U- Z- M# u+ M
            //copy data to upp_recv_list_busy7 q% l# X8 Q+ @; c9 B7 _
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; j" K! j9 M1 K) a3 Z+ X, ], H' W/ k/ M
            //$ p4 I: o4 Y" C- q1 N. Z
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 }/ D2 d. N- v9 W

% w* M2 X1 t( ~0 h7 i* ~9 @3 l( o            //
+ W2 a% Q) Q$ {" T* m. I: |. ]            server->upp_channel_a_recv = false;//
* F1 n' J  h% {: S
+ w# y5 T1 U/ a! Q6 |% t3 m) r            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 z& T: r, i- R7 o+ s        }
: }' X0 Q1 O% a! r( w    }6 c( K: F* ]; D
4 m( R/ `# a. L& k1 F1 R

, W7 _, S: g3 o4 c6 b# x+ |2 q    return true;: C6 i2 [) L: }
}9 x6 b+ K: B. P* Q1 w2 q
7 y3 Y6 U9 B" q8 Z8 v- ^
static bool server_upp_data_send(Server *server)5 ~$ J$ W& U5 E
{0 b8 U2 E" f. `) m* \$ a
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) h4 F1 o& k) F0 {, p
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 F( g% y, q, _# K+ n; E
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);; @1 D+ r3 ~/ l! w. V
        char tmp[128] ={0};
* I: P, e7 r" y0 [. K
# t+ y' K( z6 }        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" L8 t8 i& f. L. X: p, X        print_log(server, data, 64);8 E; z  A3 L+ G
4 n7 a1 ~& `& f2 y
        //
$ G: c; W0 F  W, I$ Z8 D2 G) H0 N: Y        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& c1 F0 h4 ]# H. Q  w
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ a/ G: f! P8 j3 z4 f1 P# a$ M        print_log(server, upp_buffer_b, 64);6 |" C2 J$ d4 S/ ~2 I

+ o5 H' [' X. c/ M, C3 x. A        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
' D3 v* K8 w# P3 m9 b8 G# H$ r        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 7 O, j, Y: L, q9 m1 v
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! L; T: U" d2 Z4 T( }
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# r- D" Y$ d5 X- v2 A, z% d

: c3 }, `. v- `        memset(tmp, 0, sizeof(tmp));
* W* W' J/ n# N9 I. P; L1 p- L* ]        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) I! s- {1 v5 ?$ ?
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ L5 L3 N( m0 q% `' G$ _  z
        server_msg_send(server, APP_CMD_LOG, tmp);
0 f" c8 T' ?5 x* `" c( v5 w& u! ^- L# ?. d  I5 Z' B$ x7 [
        upp_error_count = 0;
$ w' _4 Y* Y. z( |, H" c6 R# n# k        upp_dmaq_int_cut = 0;
2 w5 X( m# L( z+ ?        // fill in data * S# d" ~9 [0 P
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 [' P- L0 F' D        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. I. P* D3 W) A/ L
! \1 X& l6 ~8 y* x) @        // wait send success. ^9 g; D" o9 \2 s' _
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; `7 W. J! ?/ s2 R/ I7 H# m( O; s, I$ o/ Z$ ]$ F1 M! Y% h" O( O- g
        // make data node in free list 3 l% Y1 V' |5 |" Z1 i, h+ u- m3 a
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ a- U* p8 y$ a& b) l% m9 H/ U6 `        server_msg_send(server, APP_CMD_LOG, "upp send: success");
* n, @) T3 k! W. B. C    }9 G9 n: q) i) N: K
    return true;
: L7 t: i. V3 q+ [2 E}( H$ r5 L" K, r) `
4 C4 C% B& F& P+ }+ z

* O" d7 ]- k! h( K" h" `
; P$ l$ W; g( @2 `0 h4 q
( q7 a; H, v- n* b" h

/ d+ j! F  k! W9 y/ V; |1 S% Y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐5 V- }  T0 Y  Z' ?8 C& A$ ]! |" U

, J6 B  b8 \9 P* G8 @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-26 18:25 , Processed in 0.044486 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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