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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
( m- U' e/ Q: D; ^5 D1 _( d( p1 q2 f' U% U0 C- s/ l
问题描述:
7 ]* r7 T+ T: m在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. Z$ r/ M$ A, e% i) \, w3 t- T; V; O
$ U; C4 y" i, x% Z% _! m2 W图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" t4 m% O- \) _0 l3 G- l
4 B% u: Z% a! P/ k- R8 T' k
测试结果如下:
* U8 C& R6 D3 a) R5 e138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: i: w" k2 G) F7 Z, |! |3 g

) \6 r% {' a$ I# v) s( H3 X9 c! q, r  M8 a
备注:4 [# T) ?; [5 L- R$ F# @' k
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' ^* O! R# Y" {/ b  ?; p
2、相关代码如下:
6 K+ X/ B+ H1 m//UPP DMA缓冲大小512字节6 V5 T# U2 y1 `1 L: ^; L) H1 A% _
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. S- P; h* L7 x9 `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, c: l6 G* h5 E, w# l
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ u1 K; \! q7 i
1 x& R& L' A1 B# W
0 f$ H" c; n$ |# f& t1 s4 B. G& W//upp接收、发送buffer
. p; }' m7 N$ Y: Z3 [" v1 c#pragma DATA_ALIGN(upp_buffer_a, 8)
) c9 W+ V2 X# K/ U2 U2 H( k#pragma DATA_ALIGN(upp_buffer_b, 8)  `# @5 A1 V0 b. Y
, T' ?  b$ ^$ b4 Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 z: D4 j1 D* q6 b" h" ^unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- b/ F. R7 P6 t3 \1 ]
! m. s. O4 h$ r  a7 {0 k8 A

/ |( E$ n! ^8 X% s, r+ m$ astatic bool server_upp_data_recv(Server *server)
- ^( U3 L+ m; E" ^) B# d{
7 o! g. ?3 g- l( `- D    if(server->upp_channel_a_recv == false) {
- ^; k5 |' m8 t        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) U4 c8 o6 |% [, \/ p        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, u) ^/ N" S* L            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" D3 f/ F& q* \
3 {% e' t4 P0 F
  f1 D6 N- R! Y% I' ]" \  ]9 I            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' x. q) u3 h/ H# T7 H/ T: h4 h2 ^7 \

, _0 A( A' I( w( Z/ z            server->upp_channel_a_recv = true;//
4 q, Y- v4 s" H5 N' K3 ^            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);, x0 J- K* c) m1 `" \& S
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
" r4 D" H7 _, b' |, u+ a% L            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;: C: k" {- b, |3 k
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' W9 H4 Z, h5 Y( ~5 F8 W+ a- ?

  |+ H( D# I6 f2 r            upp_error_count = 0;) k! u. ?& J, X5 V
            upp_dmai_int_cut = 0;
! u( x# B  o2 n( [+ ]
6 l. p) |: a- m% a2 f            // fill in data
" T* w' j0 o+ V" i; L- {9 g            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( Z7 J) k9 c$ g% F8 q
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");: x) ?5 n- m: h$ I8 P' N
        }8 t. z7 U# @* c$ |6 O
    }
6 `2 b/ y8 S9 b2 `  M    else{2 m+ ]6 J" v$ B. B6 d
        if (upp_dmai_int_cut > 0){0 B/ h4 s/ `% R
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 U* S. n+ Q! a
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 t4 J. c1 U/ u6 F5 b

/ v6 k9 n5 |, Y! Q: ?3 g/ U4 w8 X3 G4 O" s$ Z5 r+ N( k
            //copy data to upp_recv_list_busy
, P& [) Y- |8 O6 o: ^            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( `( p( ~+ D  s8 Z) U8 n, a& [$ b6 J; v# Q; C
            //% C" \0 w% _* m9 J' G7 m: e
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 q9 }9 S) d! c4 p
* q- W; g' S1 m$ r% ~            //) Y' D2 i, S# q1 U$ N; D+ u. ]
            server->upp_channel_a_recv = false;//& m  F# @- x1 c0 j' M* _: Q
, [" |2 R0 N/ W
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 B6 q+ c  L7 Z6 h+ D, p: L' P        }- ~6 ^  C  f5 F, ]' C0 e
    }. [! _' K# A' X- E4 l

1 T5 f6 J% N$ h/ o% c
# `3 l4 S1 h1 b+ S# s8 k8 d    return true;
, M' Q; r7 a! k) t- z& M}4 R7 p8 g; D5 y8 x5 J4 x' G

4 h7 a/ z' H% G2 d  V0 T# Sstatic bool server_upp_data_send(Server *server)3 W. |6 M' r: N' b% z
{
2 ~. G+ u& l; J8 V% C, ^    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) D9 a( |; i6 l$ E- L) i2 x( v4 F
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
) m  b; K1 _- J        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% m6 q3 }3 m8 k        char tmp[128] ={0};
8 [1 I! n% u6 `5 T
% G6 K# P/ H2 @. j: `        server_msg_send(server, APP_CMD_LOG, "upp send: start");
; N+ R  Y5 q2 w& r- J! x& g        print_log(server, data, 64);
  r: V' N/ u# G$ F
3 p* n4 C5 f1 P8 m0 A& M$ H6 B        //
8 B) f. Z/ ]" R! s! S! M        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 t, k/ N. b* z% s# F0 }# Q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 ^* d/ i7 Z0 u
        print_log(server, upp_buffer_b, 64);
$ X+ n6 `6 Q% G$ C2 n* u: o- q4 Y, }1 ?& F
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 y7 @. F. w; @        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
0 N* j" n; J  w) I) H        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;2 |$ H7 x* @) U2 F
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ U& q: k. Y* p/ W& I( }
$ u- {$ p( G; r! u! Y$ z
        memset(tmp, 0, sizeof(tmp));
1 V" Z: o6 R' N2 f- r9 S        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 Z/ k8 `" i1 j            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);- D" g7 H# t* ]
        server_msg_send(server, APP_CMD_LOG, tmp);
- M+ ?- s8 h* J) Z1 ]8 t2 k
! _# I! x) V* a! c4 j/ s        upp_error_count = 0;
3 p: A2 U- k' ^4 g/ m' X+ p' K: @* \7 }        upp_dmaq_int_cut = 0;$ @% L: W& x* I7 w! X% ~
        // fill in data / {  n7 n0 \2 a. {
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); $ R( @8 s# z6 s( _/ w
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 H; `" L- C$ W* E
9 R8 @+ o8 S8 E8 _" z4 Y9 [        // wait send success
% V2 Z8 a: o- I2 v8 ]8 o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
  Z( d0 x' ]; n! b& H  w8 v  L  o5 @5 x- g2 o1 I. A4 j  @
        // make data node in free list ( a) z- n, g  C9 C
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- ~( w& u( I) w6 F3 p        server_msg_send(server, APP_CMD_LOG, "upp send: success");# b7 Y% m' j$ u) X4 Q
    }
" h! z8 {- m; Q( L7 l    return true;* r  X  i5 @4 J% n2 M! g
}
5 @1 s. ?* _! L  y9 j. D4 J7 y% P' b6 _0 R7 s' c& }! ]/ j  Q% X
) T8 O) U. ]# j" g( C5 a8 l( N8 \
& T! w: T9 s& g5 o" m' C3 R5 A5 s) ~
8 G) R0 d2 Y+ A! R  k
. m+ C  b5 n. B

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
5 e) Y) ]8 @9 K* L( ^2 j; o7 }) W& _# ?! }% A# r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-11 13:15 , Processed in 0.042737 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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