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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# B( A8 Y' J5 p2 A2 U* i
/ g8 f; W3 _% m  f( }问题描述:. x* \. S$ P+ ?+ o& r
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
" D8 D' K7 w' @6 T8 u/ V  e: Q3 s' Q: r% z' [
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 c" H% i3 Z$ R( K: G1 U! Y
. j: Q4 w0 a/ a
测试结果如下:
; c7 Y) l  s7 L138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* O- M. S- V6 o; M- S

, {4 u: f; Y- b  S! u# i  d, [' S# @# ?
备注:2 u# J' W0 c+ ^$ x
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?$ `( b5 s; B- f
2、相关代码如下:) L- o2 B$ z( j
//UPP DMA缓冲大小512字节4 i4 r0 e* ^, n& V! f0 x: F9 Q
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ }5 H& D$ S. U+ t: g. w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 {( d8 F+ G- s1 t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" M3 T0 ^3 I) ^  q+ g+ U& ]# C) l  P+ O$ W- A1 }& y
4 V  g  u& O/ T1 ?8 C
//upp接收、发送buffer
5 a1 ?- P' V  Q#pragma DATA_ALIGN(upp_buffer_a, 8)$ I8 G. H% F5 |* b
#pragma DATA_ALIGN(upp_buffer_b, 8)
1 H& W2 }9 `+ U4 }- f
/ g0 \! D/ _# @2 d( w, p  y8 ~+ bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 o4 \9 t5 M0 C4 \+ o) o8 G
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) B, }% I3 x- W) A
, i0 I) v) o* L& i
" B$ L0 b. t% `& z7 g
static bool server_upp_data_recv(Server *server) 9 O3 J3 _5 @6 B$ W5 g. V
{
9 E' S/ U8 q  K' g# j    if(server->upp_channel_a_recv == false) {
6 j) {4 P  a- L3 B! L8 D3 F4 L        server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ N3 |1 o+ v* O2 C' s9 m0 ~+ y  u8 X
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& x# D" T/ F3 o- R8 [7 }" ?5 {' U7 p6 x
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");( O/ Y, X- N. U9 j. z

2 z2 V, G0 T2 Q( }: g! O4 |# _% N6 _  m) V5 h: @' S8 Y* e3 y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* ]# C0 p! H& E3 ?& w9 q( ?4 W, L( |  ^, |4 g
            server->upp_channel_a_recv = true;//
2 }" d/ M- f# U% I0 I* W  c- B            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# L3 N9 |" h! ]" ~            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;" f9 h4 F5 W' M) K. l
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
1 a+ \1 [+ R/ u  t; Q7 m: H            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ F) x$ m* n  Z# u: T

9 a0 {& c% \. _3 O. l. l            upp_error_count = 0;: n  h, K/ T7 i8 d& A
            upp_dmai_int_cut = 0;" u1 }: }5 o3 f% p

4 t1 m  S4 g& @7 Y- S            // fill in data $ `4 R& }2 L! Y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* ~' a" ]  J  }9 }; m7 [8 n* c            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; V  Z0 V0 H# h8 F4 j        }
* W7 `, S4 S5 W7 y( \, U+ C, C    }% I+ u0 p% C# t5 ]
    else{
( p6 m! ^# u: Q! L( p) x( i$ E! L        if (upp_dmai_int_cut > 0){
4 Y4 T6 Y! l0 f9 Y            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" W2 @+ D  Y* M8 Z1 p
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 Q7 N! e  h8 W3 h1 \( s# ^( G

& M2 U+ O1 v8 X$ B/ B- X
3 H* ?; C; ]6 g            //copy data to upp_recv_list_busy
1 U+ K9 b2 m0 X  `1 |9 G# i            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 a& C# x' h! Y* H

& R3 G$ u* y2 N7 f- C  [            //# x! X3 _2 c. M! ~: e" P+ v
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);3 V# V. v2 x2 F0 h% Z

  ^9 Z# s# `7 t6 A8 G            //
5 A( W! i; ?& ^% l+ Z9 B: c            server->upp_channel_a_recv = false;//) M: a0 w! P$ L& K+ {5 B4 a
) O0 c( Y) V$ Y9 \2 a1 O9 v, e% L
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
; s: Y& B# _) b$ i        }( }0 A2 n4 w9 e; x9 c+ R
    }3 n5 J" U. g) Q9 n. p% B+ Q

- g" m* M  j* m; J9 _
+ E2 L% F5 ^: j    return true;% a; G& @- {' k1 ]  _0 `
}8 E* z- t. o5 T  z) T9 r

! F  c, ^3 p  f0 b0 \9 r: G# Gstatic bool server_upp_data_send(Server *server)' X$ ^2 a% }7 J3 F! o* N
{( p7 {  I' d( r2 A! S. `+ W/ {
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
. |; K" s1 W5 S3 ?6 E! j        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 i" `! Y' ^7 U5 e5 q        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ G1 K! W, b4 \/ A: @
        char tmp[128] ={0};
3 t  L+ k! O9 h$ O
! O# Y& c# Z$ o! O( \        server_msg_send(server, APP_CMD_LOG, "upp send: start");
- z/ K) y+ L0 F% F9 l) D        print_log(server, data, 64);
! q, A, U" X8 {. m* z" v; L; k/ Z2 [6 r6 S& \$ ?# ]
        //
$ C2 E% p5 k- h: I! S  J        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' y* y& p% z' j: N, E7 T        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 y+ q% h  H$ c1 H        print_log(server, upp_buffer_b, 64);
4 ^3 y) e$ x" r3 S$ n5 P2 n5 g; ^3 L* _' l1 R- l
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);3 E* R: e$ c7 v' ^7 P' T# Z
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
# N' d* u8 X+ q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
: b( ]$ j. t% c6 W4 w        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
/ G' Y8 V2 F" y1 `- [# t1 J6 a5 @0 q7 q6 O& E8 X
        memset(tmp, 0, sizeof(tmp));
7 a: Y6 X' X' u+ w- ?" w+ t- ]        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ R" h+ K7 ]* H            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' y% d3 o8 w4 C, T8 v& T
        server_msg_send(server, APP_CMD_LOG, tmp);) [' n7 L) g' e. P4 U6 y; z! n8 S

0 ?+ `& t6 I' F6 h        upp_error_count = 0;1 A" G3 C$ b/ M7 U: j
        upp_dmaq_int_cut = 0;
% U) H$ |9 }  |5 q8 `( S2 ~        // fill in data : {3 c0 |( C; }% k# ^! X
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 @- ~3 @+ `$ [9 |8 K$ N- }0 Y% I+ g6 k        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");  k4 f8 T6 ~$ H
8 w' G/ w3 N2 T
        // wait send success
6 k6 Y) x, D& u" ~) F9 }$ W% N        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # _; |/ E' a  j' E9 h

+ K4 a; }3 d. q; h        // make data node in free list
% C6 }4 ]4 d1 L1 i) B. ?        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) t. D. x0 U& U* g) ^0 _3 |
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ Q! n$ F% B3 C5 J" @" G    }5 D& I0 K) r1 O) l! J: F* @7 b
    return true;
, d; P  q/ Y) a+ @% q, F}+ q- R6 F0 y! }# v7 Z
* ], c) h$ Z1 Y- e4 D2 X, o

- j- q  H* X6 W* [, T3 m; l% u' }; w3 R
+ B1 |  G, v) ~! s; F$ i9 i
1 a/ ~+ W- t, W' \/ |  t. W* p

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
5 L1 t5 a. ]! X4 m: V- ^' U3 R; S& b$ E9 L

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 11:36 , Processed in 0.044129 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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