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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 n2 a6 I8 [, @5 x  ^: P5 S4 Z9 f+ Z4 _
问题描述:
$ U' k9 G* Y1 Z4 v6 z# H在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& F- [+ ^# r, J
  W$ N# l9 Y1 y; l! s* o7 n. e
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
  \, K) B  f4 ?% k* I- M; x$ `9 x5 \0 ?$ e7 ^
测试结果如下:
% ~, X; U- m( v% W* W138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' U7 y' n; z5 X' I2 ^

" p- Q+ i& ^0 v5 ~0 S
9 Q- t7 z9 i# x+ P( S% {备注:% a7 C7 \, x* E  r( M6 ]& M
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ D! Y6 q. H8 _
2、相关代码如下:/ ]: x; p" ?3 s* k1 w( h% g
//UPP DMA缓冲大小512字节  r! m+ ]* s; m8 T  d
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍7 x2 }. }' [7 O
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( H5 p! {, _8 n, a2 N" h#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)2 h6 X# {4 _- B( {

% ]( o5 W: t/ J/ ~1 e6 u1 |# V) k3 n
' F1 b/ g( w& u& W1 c( F0 ^//upp接收、发送buffer! j) g3 f, ^% f' }
#pragma DATA_ALIGN(upp_buffer_a, 8). e) R+ m9 L/ z8 o' C: p7 p
#pragma DATA_ALIGN(upp_buffer_b, 8)! O0 U( e- i4 m7 c" O" l

( b- V9 D6 N2 h  ?$ P) _. Dunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' ?2 Q! M3 f* Q) n% J8 v4 N6 v3 \' F0 ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# }, b; N- h6 E0 N
* Y2 x. I! z6 W4 |5 }+ M9 a5 g; |; H4 V4 R1 Q; X* u( Z
static bool server_upp_data_recv(Server *server) & z  a( I' @: b: I
{
. |6 J$ A( L0 y, l/ Y5 j+ X2 W/ R    if(server->upp_channel_a_recv == false) {
8 ]- J0 z7 ^/ ^/ t! W* p. B        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# ~1 m* K- c" O# P6 h        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ L+ s1 K# P% U- B( d# _
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
& z' i, v/ p) z8 B- D! ]6 n; _3 J: S

) @2 f; w5 w# v0 |5 o3 ?: `            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 \5 p) d1 W. b) a" b  ^
, Y1 d  n* Y2 i8 ?
            server->upp_channel_a_recv = true;//8 ?0 W: ]6 I& E3 J1 g) X8 b7 _
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);4 K# ]; z! @* v" C7 d
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;6 b/ |' k. m( O1 R
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
8 B' n" K: g& m# \            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 ^9 B; h9 ]. }; f! O8 W5 Y; q* d, w( ~3 Y
            upp_error_count = 0;
! d1 y2 j8 F" v            upp_dmai_int_cut = 0;& h$ \; w! Y4 Y% ^
) r1 t0 k6 j6 i& g
            // fill in data 6 C* W- F1 q6 z$ x  M; x
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 U: t+ x, j( n; b" e/ K9 ?
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& Z; c# C4 X# j        }
$ J' C* j# w' E4 B. e    }1 C# P3 ]5 }. n( T7 c0 L
    else{
, ~; c2 O1 K5 J" U& q        if (upp_dmai_int_cut > 0){
, l, f$ {: c7 |4 v: b2 P3 O            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' |6 c+ y' Y+ d4 n, d: ^
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( p% H/ P( ^6 R$ }2 a* _2 [" h8 H5 v, t, B

# `5 d1 @5 x0 k% g5 S8 T            //copy data to upp_recv_list_busy
! d: X% ?" f( s8 O            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! l3 G! Z, [) M. z: w* Y
7 c' J# S0 x- T; m, M            //6 y# A) q8 E/ x+ r
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; X, K5 s( v, [9 @
8 S5 ?7 f* G: b$ \! k: L6 Z4 y
            //
. N1 V3 w+ n2 Z5 r            server->upp_channel_a_recv = false;//
, g, \, k2 A0 Z6 n6 v% q( y" ?' T' j6 x) i
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 ?( C# F9 v( z. v) l, g
        }
4 w' [9 k5 Y8 p    }) x# _3 D; j9 k* u8 u
2 L' Z5 E. U' D$ |' f/ v: M

6 q3 ~% T$ Q5 R4 h9 L3 ?& @6 {: J    return true;
; K5 u3 d6 T, y. [9 T& j}
# s1 N8 G1 x5 `  e! n
1 k$ Q% T: h0 ]  \% dstatic bool server_upp_data_send(Server *server)' u% T; m  V6 ^9 `2 e, L) ~: g6 @
{
; j  A& ^; z' g$ O    if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 d+ i. l1 H6 O9 h
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- Y- O8 @( _3 c        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( B+ q- f* O, O        char tmp[128] ={0};# f; H2 F" x! i# s3 G

5 j0 s9 r. |& Q: p# g        server_msg_send(server, APP_CMD_LOG, "upp send: start");4 N. c& d1 t3 v! }0 N6 O
        print_log(server, data, 64);
( b  F6 u/ c! R* b1 s( |( d! ~* _) S
/ _9 [# {; s  f/ C3 p& {/ h        //( Y4 C1 X! X$ z: |/ G9 M
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 q0 S6 J: I4 Q; H7 f8 h4 }1 E
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
, Y) Y; J  k. m) u8 K        print_log(server, upp_buffer_b, 64);
; @8 \$ m0 D; \) O* T7 Z0 g  E) I4 w: F" @7 U  u
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);- u, S0 j6 i2 \
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
7 V; R- s! U) u; ^- H' s        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;9 C. q& @! J) J
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;. h) m/ `% O0 ^) O* @" x$ v6 [* O" X; ]

- e  W7 s* G: ~' T2 d1 E8 n( Y+ i, X        memset(tmp, 0, sizeof(tmp));* E5 i$ _# @+ `; V
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: p0 }" i& ?4 i! q" f* h* }            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* q- j4 M6 P7 G
        server_msg_send(server, APP_CMD_LOG, tmp);% s; T& _- ^2 F

( z) g/ T3 S) q: }; {        upp_error_count = 0;
, b2 Z$ j: T; `, t+ @/ G/ p5 |        upp_dmaq_int_cut = 0;
) i* F, N" \9 d/ k: j8 m        // fill in data
! k! ~, u% O) B) w! _        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
, M7 _4 w+ p; h! y7 x5 R- x$ N        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");  x5 s2 I3 f& v& y2 g

0 R% J5 W* m* r3 `7 h" `        // wait send success
) W7 {7 ]' U5 l% n        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); / i- y" X" ^/ Y: ~3 `

; U' I$ L. P1 {6 d9 s        // make data node in free list   I( I: d  d. s7 j- b& @$ N
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# f4 e1 D! w3 d7 t. j
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 t  H: m! l! u" Y1 Y    }. ^; D3 a, e7 n: j/ h# O9 O
    return true;8 @$ H4 X2 v! ?. a0 _
}" }' X  ?, k  G& u
' w3 g" l3 |2 e( A* u8 z# E3 c4 F

" G& x1 U# J6 x! ?8 Q, t& K1 f2 U# c2 J
1 D/ p: Q9 z- C! X! T9 Y9 |6 N
/ Q# j- j/ P8 T# |' |# {! R+ R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐% K- Q: R. b/ L( m

* @2 g3 s1 ~+ c

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 23:03 , Processed in 0.040034 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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