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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
  ]$ `% j/ i4 \: F7 U: m1 [$ V
- G! j5 J) I/ }. ?) T) X& ^% U问题描述:
; B& b' N' _5 \. i" R7 e在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& T( o0 [$ J3 V5 \
) P0 @% H3 W4 @3 C3 h
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。1 }0 B* S: C9 \, n+ }
5 R  z" N9 \3 T" N! L8 r
测试结果如下:9 A$ j9 F) `& C& W! p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( \( l! o# [+ `
! d5 o3 Q3 u1 C! ]9 g; _( K, X" `4 w2 ]) z2 I3 f2 F
备注:( I5 S, w, M6 |$ R: T
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 h1 w3 C; ^, N
2、相关代码如下:, r* \2 g7 e- D9 N1 D' e# H5 U
//UPP DMA缓冲大小512字节
; S1 u( @9 T, M. l#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
  V: D0 W  t% ^0 C. r' E#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 `: G1 W" a3 V0 s1 e+ ~
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. u  Z+ J' p+ F/ @1 U; \
. |6 z3 m$ r' w! a+ G. I* P4 b/ H# P; `) w: m
//upp接收、发送buffer% |1 f0 a+ t: R  `' P
#pragma DATA_ALIGN(upp_buffer_a, 8)# L9 h0 [$ f: U) R; h2 q! `) L
#pragma DATA_ALIGN(upp_buffer_b, 8)
: a# r9 ^6 |( F& ?
, U- Q! s  K/ f% e6 |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) n* I. J$ t% B* z9 w
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 n# o" }) p0 e  j. J4 Q( [# A0 ^

1 Y+ _$ k2 t& ^3 ~9 p: X& u, L5 s: O, `& W9 x4 s6 N
static bool server_upp_data_recv(Server *server) " X) a2 J" t  |
{4 J1 l4 L+ B! b1 n" \$ `
    if(server->upp_channel_a_recv == false) {. _6 L* z" Z2 q) p3 Y
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& _' R' k- C9 H. }( H2 t0 K! C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 Z' n/ k* a3 u5 W+ P; S% E
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* }: p! {/ F) w
# c9 i0 U+ x& H; P) V( h/ v# b
% k2 c# X/ [4 V$ T
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  `0 g% H! l' Z/ j. n* i

( t# e+ g% X, W, Q            server->upp_channel_a_recv = true;//
3 y2 c) B' t7 J9 i/ B( L            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
/ f7 s: B9 X( m            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;9 F9 s/ U3 l& S, S) A& A0 V5 Q* R
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;/ [2 ~& [% g2 c& d+ |
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 ~% t: F7 L/ n: k% g. t# J" }9 r1 ^6 {  o
            upp_error_count = 0;) s  C: ?. ~% M$ Z& G: a0 `. S
            upp_dmai_int_cut = 0;7 z% L  J/ ^, N- A# C

+ _- X4 K+ }/ E# F: u8 {            // fill in data 2 E- J: v" _% \
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ N7 e6 D7 y$ T$ c9 j5 C            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ G* ^% ^/ F$ J1 A$ C9 w" a& y9 u        }
/ m% p; J0 L- E& K0 J    }; t( I7 }. T% _0 b
    else{  F  o: J9 z3 D' x4 [. |
        if (upp_dmai_int_cut > 0){( s9 X8 O. D: W$ Y, d2 q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 \7 O! F/ R" h            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 F, ?$ `  u4 z. B
" l8 Z: Q9 }( G$ m

+ ]' j- B2 l2 p$ V            //copy data to upp_recv_list_busy- T2 B0 q1 ^+ @* r3 T
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: j" X2 o6 g; Z7 S+ b& V& M, X
- D' o4 E  V$ A; P/ L6 v, \$ ^" G
            //
3 }5 X1 {7 G* V8 a: G/ [            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ i, G- D4 ]  `4 u2 i% Q$ p! r* e" b& z+ q, P$ }
            //9 V+ \3 L: f" h9 g9 o3 z6 |+ k
            server->upp_channel_a_recv = false;//- }! ?7 m) F$ F' o2 E

% v7 T- Z9 i+ D            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. ~" z; u: z. v5 a: V# M        }6 e1 I, k; v7 [) J# y4 [% U4 {; q
    }, I. T9 b1 l, A& [4 }

: e# \: f4 o9 v5 \! ~! I% K/ d' o5 H
    return true;
! y" M3 M: \: O# z  u}
6 ?6 o. d$ _# x* l+ e
" f/ o( I* ]/ U$ E  `static bool server_upp_data_send(Server *server)
! W4 D8 Z, |6 D; U3 G{/ E) |7 ^. Y9 e! U9 X
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* n; r' I+ j1 W8 P        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 {4 O9 @+ n1 t
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 j3 U& P7 e, ^" S
        char tmp[128] ={0};
& f+ U  a8 r) x
! q, y" D+ c  {% o        server_msg_send(server, APP_CMD_LOG, "upp send: start");' z2 Z+ B. x/ Q3 m
        print_log(server, data, 64);  b1 v$ r. m3 G/ t6 \$ E. W& ?5 R

+ Z" c- C4 t- y( \- D. I8 M9 [        //
" ?+ z' a2 f! Y& s$ \* o! Z3 ?        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 k! M, [" P9 T        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 i" K8 M0 E; S2 s2 x0 P
        print_log(server, upp_buffer_b, 64);
- }  r1 R& @- R( q/ f& ~0 ?7 m2 h8 u' f: u" V+ p1 k
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
& i- N2 V1 A2 Z7 R) l( \0 m        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 1 r# B1 f/ l3 ^7 d
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! @2 B9 y' C5 V4 {1 R* l( I8 b) S
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;# p& \6 v! d; d$ X

! \* i3 s! q* ~- N. d7 V        memset(tmp, 0, sizeof(tmp));
/ @) k! K0 }  P9 z- ?3 w1 [        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * g) Z' M+ g+ O% m
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" J3 x- X$ f* ~7 K
        server_msg_send(server, APP_CMD_LOG, tmp);" O. h' ]3 g6 f7 H+ _% ?

: F- Q' h/ a$ `1 y: `; P2 o1 y        upp_error_count = 0;
2 L! R7 r! n- s/ G! T1 @        upp_dmaq_int_cut = 0;- E; m: [& A* P* u% \. X- \. q
        // fill in data 1 E" n) J6 M/ V4 O9 c* O
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" _; E  Z, B6 u3 d9 S        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ [) j( H# s7 \4 m1 J( d; R" u- f
! e5 d8 ^5 B* R' j% x
        // wait send success
2 x5 K' A2 F% e# x        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# P, }2 `9 M* J) p. `0 b1 I6 x+ {- s0 E6 @! Z* {2 v9 ?2 V! x0 S6 [6 t
        // make data node in free list
2 K1 K4 V! s8 N% [* t' r! O        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 ^6 k) w% H4 y0 T! n  T
        server_msg_send(server, APP_CMD_LOG, "upp send: success");. |! \* l1 Z4 V. R: `
    }
" S% }- ~6 q, `: [' u- N, M! W    return true;6 l2 {/ I  L2 P% a/ T5 v8 H' q
}
$ C4 G  M; F' n: m/ U0 Q/ Y6 E4 ?( N) v0 x
& w) R7 U, {2 N5 u* ?
$ C1 @& p- N$ V  r
4 Y# C/ D/ r1 x' H& ]
& o; w0 L; ^( `' ~

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐& F; M5 N0 I. q* k7 k1 }+ t
% e9 {& j3 V9 p: T

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 20:02 , Processed in 0.041479 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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