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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; T0 a/ K# q, z: |+ O
/ P6 F- @/ b+ B" q; J) O4 Z
问题描述:9 n+ }/ \7 e( r4 g9 n/ Z/ k
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ a1 x3 g! a% c2 a; ~" m

$ s7 r6 u) G4 h图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, P: `9 W# p" u& f( k% X4 V

* r/ _# @" M% Y1 E7 a7 o测试结果如下:# m; l+ l/ J1 O
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
, z) _( Q8 h7 o, ]. F& \
4 A3 U# W, J! L* u& ^4 H, e/ B2 a* Z9 X' w" m6 p/ ~8 h* l+ g5 k
备注:
9 P: O+ z+ H" F8 }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ J: g7 a' L4 f" G6 z# Y
2、相关代码如下:
3 R& t1 x9 d3 N( ~" z//UPP DMA缓冲大小512字节
- I) y# |5 S! t8 ]' b' \* l- [#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍/ k' d; a  @4 d0 x) ~4 h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT  I7 L" ]; ]6 l" T  t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 o/ y. z" c& ?( {7 m. C

, U5 O8 A% l3 v
$ e2 B: C3 c! [; k- _! ^2 M% n//upp接收、发送buffer
- e* o( n# S2 O8 X1 }& s4 d! ^  k#pragma DATA_ALIGN(upp_buffer_a, 8)1 U4 l8 e0 R4 E# }: `& m5 M" u
#pragma DATA_ALIGN(upp_buffer_b, 8)
: f) X" n2 L9 B2 P4 _* y
. Y8 z  h  z' X( H- R" u7 n/ u* xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% }- J0 B. O: ]( Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
. @9 }. _. J& u3 U8 J% U# O! O. h1 e+ F

& f4 r# c' X1 P" ?; Dstatic bool server_upp_data_recv(Server *server)
6 q% D2 [6 m! a6 T" a7 `" j{9 L* E& ?) \. B4 e
    if(server->upp_channel_a_recv == false) {9 M, a) S4 `5 |* f% p
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 Q7 R, \9 H6 I# ?0 O7 \" s
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) x$ E; G$ D& {6 T
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");3 W4 @) _0 w: J. ?7 j+ N2 D3 M
$ A/ B! P1 }! c" A

  U/ y( i! J1 [: ^7 c            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 M  e3 _( Q! |" @# ^9 l/ m) a/ s3 k' |

! t0 U# m( v" ?- y- {) S            server->upp_channel_a_recv = true;//
1 `- f0 n4 {# H            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);4 `6 V, E4 ^: j8 D( z
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
7 s  n, ~& G" t            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;/ q" q8 I4 B. s0 O
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//& x2 f/ P( Q6 I9 c2 V* ]0 R
3 p4 E* }- s$ R$ y( H
            upp_error_count = 0;
# R) Z$ s  N0 U8 p- Q, k            upp_dmai_int_cut = 0;3 {! s$ x7 @: w/ o
  E9 Q$ U( r$ I# I4 }
            // fill in data # P& X4 t! M# f# K' w% y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, }, y- t! ^' g; c9 ~6 u            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! @. z/ v2 e7 k        }1 j: b4 V; I. N. i  h
    }8 G' s5 a9 i) D* N. Y" e
    else{
; w# I; @! d  v# B+ y# _7 G        if (upp_dmai_int_cut > 0){( c# f. I! ^" I( r8 Y
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- M1 O( b: B( e/ ]
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( \0 L/ h& l6 M' ^  e! t& c. W! Q

& ^4 G' y5 Z4 b0 O  b
3 b: u6 _9 g7 `: C% ?            //copy data to upp_recv_list_busy
( X4 d4 o% t. y            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 b- A- @0 `8 W8 _& o1 H1 y& Y* P5 r- e" t/ _
            //3 R3 ]* i( N, q. Z- n& X
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
) R5 q1 z% i% J0 Y: ]0 d8 `- _7 T! F8 V! R
            //0 k& B- |. p5 @3 ]" L5 P  U( J8 w
            server->upp_channel_a_recv = false;//
+ v) o. b+ ~, [, i. X) Q0 l/ h9 A0 m6 m0 u6 N
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 h: T$ {0 l, W3 K        }
( J+ z/ A' [+ p    }! |( H& |; m* p: y0 p# Y  u7 \
  M0 K6 @: R% {
7 e. }* C' R6 l1 J  _  d
    return true;
3 r9 Z& Q5 e3 @" T3 k$ n}" H3 c4 }# p( N- G9 Q* D9 M: q

: X+ {* \9 W+ p% C5 Gstatic bool server_upp_data_send(Server *server)8 w6 B: \- `$ p7 N' a
{
+ m+ f: B! J& x% ]5 d    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 |; P% \1 d7 x9 ~5 T. o        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) q* c* v+ R9 i" L, Y. h        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 Q' w- l) }0 }( Y        char tmp[128] ={0};
4 {, k8 A8 i8 n* {) x9 F1 e# ?$ C* m& T: I8 o3 C
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 C: j/ `, K) D8 u' z6 Z9 d        print_log(server, data, 64);
" B5 |0 y8 f2 f0 P* C( O7 }& @; v+ c5 }/ F1 s6 P; p
        //4 s; u8 Z( H, o* j2 ^' ~
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. v$ N% d/ j2 K# J+ b, I: a$ g        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
# k6 H0 H+ o) E% y# i        print_log(server, upp_buffer_b, 64);
$ r4 `% _3 ~: I" ^* L7 J- O' H( T0 p% ]" y
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);9 h6 {) G" x' r, s5 t+ [
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ( E1 x# X+ b& ?2 ]& z
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
& F/ Y6 p0 O; D5 S) W        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" ], Q7 s# }8 }' B, B0 _' q
, c9 ?  O- O( J# X$ h, j0 t
        memset(tmp, 0, sizeof(tmp));+ F% E  A9 P- G3 `
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", : M  i  h; }0 w4 m# {2 a  n- {  e
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; p# ?1 D8 H2 S# Y        server_msg_send(server, APP_CMD_LOG, tmp);
& N! ~, q. u1 b+ y( I7 o0 O" W( t: v5 p3 ~  s
        upp_error_count = 0;
, l: ?1 B7 j! g# }        upp_dmaq_int_cut = 0;: D! V( g4 k+ K6 q, n7 t5 |# I
        // fill in data 7 w4 r' Z8 o( B' [3 F, E
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 P7 f" o: g/ c
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 K+ D( X. A5 V
- A& k, [) d; c( J8 P6 J9 l7 |
        // wait send success9 Q7 E- B% N% T! S" p5 d( u2 J4 E
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % g& i" d4 I1 `% G) m
4 i, c" @8 V* H, V+ c: B
        // make data node in free list
. S# {: {) z2 @        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& h! y$ a7 V0 C9 v8 i! h        server_msg_send(server, APP_CMD_LOG, "upp send: success");
! `' n; ?/ U& R2 \    }8 T' s% |& X6 I; G' a
    return true;. t, W; G/ i; q) `% @: N4 w4 b1 y
}
7 \2 [! G) k5 P+ g. I# r/ ~' B+ g! s: z- v$ o7 H! Q' w

( N* T, g  ^6 c, x8 \1 y) j1 t! t; H) V
' M1 b) P3 }+ a1 H

+ U; d7 S( h; H% y0 q& O* s

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
, v2 x! g- A* s+ D4 I  X
: ~! e) Y9 E8 t

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-2 23:42 , Processed in 0.039850 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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