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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 X3 b7 W: P" q9 ^$ z0 O: p5 ?
( W3 ^3 p1 ^  A/ r7 j问题描述:: Y( O1 x1 y3 B# C
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 U1 g- C( g: n. R1 N2 I( L5 l& j

7 D/ ~2 A7 E* f- s1 M, K; C) Q图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
5 x3 \& h7 E; ?" F$ p0 `" d; D' {! u* z: H
测试结果如下:  c; g# L$ d! y& j& s  B7 I0 H
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- M, m# F2 ^: j
3 R3 T- @0 b3 R3 @

) v' T: F2 s: n  t+ I5 v备注:
  D8 \1 u, W, E! J5 J3 J$ f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 H3 g3 {  [8 K+ M6 Q3 m5 G. `- B. z
2、相关代码如下:
. o7 {+ {6 \8 q% j& c( U& h; f//UPP DMA缓冲大小512字节
& a: r" S3 A/ r' j$ N. j$ l6 k#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( J/ }+ [: \  D' H
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
" A; X/ d$ E) n, e+ O5 w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 R5 u4 h' ^! `7 v

5 U6 m) Z9 z$ J. q8 F* r- `' H4 v% L+ F* S! y1 y
//upp接收、发送buffer
# U6 ~( J" ^! W9 P#pragma DATA_ALIGN(upp_buffer_a, 8). m' f+ o0 S1 v) _  z7 X; g
#pragma DATA_ALIGN(upp_buffer_b, 8): @$ v: _) x- d; F5 M
6 r8 B% q4 p2 j& k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 l$ U8 B% Q; f; junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];8 R2 }, S$ }9 k3 U7 V

9 `4 x4 V6 E6 I, R( U1 e/ K6 x( y. s
static bool server_upp_data_recv(Server *server)
# w5 g+ l% r) |% p/ Y$ A, n4 \* ^{6 o  s+ \" l* b1 t
    if(server->upp_channel_a_recv == false) {% t: I3 X0 `) K% G
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# O; g4 M8 E, `        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 Z5 O. ]9 X2 |+ w3 L+ I# E3 }% _
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 m: R0 l2 M2 T% s
) X! {) I" Z: t
. p1 U7 O+ v  E7 @            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ p& F# R7 [+ U) g! M  q

' F% Z5 w; @; Q) \            server->upp_channel_a_recv = true;//+ N/ m3 x  s% _' H- J
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);' p! D5 o3 [8 V, U4 n" s
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;. e  V0 U( I/ [" c* ^
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
8 k5 P+ q7 o( Z# X0 u3 @            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ i7 u. m& P, h+ S- x( F3 l2 Y8 V) d" b
  C" c8 r* _: S& S" t            upp_error_count = 0;* w$ I( [) `! Y; R% Z
            upp_dmai_int_cut = 0;
$ u0 s) [" W* Q& t1 a5 I! O
" w1 z4 u7 b) O% n$ u            // fill in data
7 k8 i8 S' ~. v/ ^; I* S4 v6 {9 T            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 H. _% y+ Z4 G3 |9 n& {7 V8 W6 h! b! Z
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 L: q& x  A7 k8 u+ h0 t
        }1 O( Q1 d2 A+ }1 I  ~0 Z
    }; Z" _: t, b, |
    else{
+ }. r: S* c: Q, S        if (upp_dmai_int_cut > 0){
5 T" z# K! P6 Y9 {            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ E* W2 w& X  i7 L
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
* _" Z9 _0 L0 U2 u6 i( {. N
( ~3 D1 N9 U) x* m
5 X* j! \7 y0 b            //copy data to upp_recv_list_busy( O8 e; a: _( E; e0 X3 I, \
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, T/ n) U8 w$ z% D- p& j$ [" M
4 C5 V2 f. \" R& P* }7 @% A            //
' \; m8 R7 _) s) o1 o% ?            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% B4 Z5 a" G8 O
% L  ]0 ~( _3 g# V* E            //
, J" [2 U! n: Q* l8 i            server->upp_channel_a_recv = false;//
/ D; H0 i9 E4 j# k7 w! ]& B8 `* r5 z+ g! M! Q* x
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");% n# B7 G  s* G
        }
2 l1 u5 k# V, k. ~, k# O' K$ Q    }) n% f. u( P# i/ A
3 p; x7 L( q" ?; R, c& D
* A2 o3 }4 l3 j. F" {% X# R
    return true;" j- B7 G8 Y) \: c/ b) |
}8 F* e8 O0 r3 \: ^. F* R
, r3 o  k9 u3 n2 P
static bool server_upp_data_send(Server *server)
  }$ y& F# Z- l2 ?, u{
- ?( b: x' c% o/ f1 ?    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! Y2 u5 K& k4 n: r
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
/ W3 v2 s1 Z* G5 ?) `/ [; i        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);  i4 u8 b: w; U2 D
        char tmp[128] ={0};$ w2 _/ d4 p4 x

# ?8 C* I. M  N. V8 T% Y        server_msg_send(server, APP_CMD_LOG, "upp send: start");
- A. L, F2 \' J4 ]        print_log(server, data, 64);
! m) U$ p/ ], {* b7 w9 k
: h  Y. o+ u8 @) y        //
1 v/ I  s. y3 I3 ?        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* [6 p1 c: x8 J- d4 ?
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; S9 Q5 L( S- t, h) \" A- t) Q
        print_log(server, upp_buffer_b, 64);
! e2 p3 z2 e8 N1 _- X) U+ W
  z1 w9 g8 R) O$ `) P( A) j0 e        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);% M# E' W; w0 t  U# U. M* ]( Q
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
! [( O) q- W; z6 V0 d7 u' H        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 y+ }1 ?! F: V/ ]6 [- I/ t
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;) d( H- S5 `. f; T2 E& P

4 u% P0 r  ~( K) M1 ]        memset(tmp, 0, sizeof(tmp));' O1 i2 ]( U* x0 E* l7 J
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 6 A6 [  s- _) p  {7 g
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 B! |4 O4 O  e        server_msg_send(server, APP_CMD_LOG, tmp);
. @0 M1 D* A8 _! y
/ e3 N" w* Q1 l' G        upp_error_count = 0;
" a* A8 i( \" c3 E: c, t: D        upp_dmaq_int_cut = 0;
; K2 |; F6 h3 w2 h, Y( l        // fill in data 8 J8 e* q% s5 r% h* I6 I) z" @2 J/ N
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% S  ?7 l' S/ G        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* A" i  Z5 J# a' ]/ ?
+ b& `) W$ \- s7 }) f  z2 C' l
        // wait send success
$ i4 H) P) [5 t        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 I9 B8 c' ^, H# G8 p

; J6 h& Z, G- `. X0 K2 I( _        // make data node in free list
& g* C; ]) E! l) x5 `4 R* a) {        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' D2 @, V" D( ?+ h  X) g% U, D        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 J( y& z) O+ H" d  x! y0 p; r8 d* c
    }( y" y9 a7 s% e1 r0 u6 D( R
    return true;
3 E% u5 m6 L- U}
; T/ e' `! T) ?, ?# u. Z- B; x! g% r* ~5 d
1 A4 s2 s% |+ _) l
5 ~2 Y% T! o  l1 R+ a6 H1 _

& w. J; |$ z+ N' n- i" k
: _' D  K# ?8 \4 d

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
! ~. l  x+ l$ ~% T7 T. L! P0 O* q- ^% `

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-1 13:39 , Processed in 0.043427 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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