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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 M3 y5 i6 B6 A& M8 |7 i
  k/ b0 W2 S) g- a' C  l0 c2 I4 ~问题描述:
" j2 [0 y% W( a9 j! l1 \- K在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( G2 R' a- s! R2 Q0 W
: u( r( A& ?( p0 n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 N/ ~/ g( [% D7 {6 l' Q: k9 d3 Y

8 h( o) t5 i( N2 I测试结果如下:
8 p- n1 ]; X6 Q2 `; c2 V138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?; [& b! Z+ w/ t6 H) F$ u- f
) M6 _* K7 @- h, |& W
" ~1 S7 V$ F4 G2 O$ K: q
备注:
; L7 t9 u- p( o3 |2 J8 T6 m1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# c5 O0 y! y8 D4 u" @! g
2、相关代码如下:
( d+ `9 D' b  P8 S. \' s//UPP DMA缓冲大小512字节
. e0 F: E5 m5 T4 K2 I#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ A& Z; W- B8 S/ @! `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( r4 h( s! N0 d$ t8 K4 b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)# u. b9 r0 c- z$ {2 b1 q; _/ O

: y6 _6 e' R/ _3 Q* a/ X! z; F+ J
8 i) W7 K! p" w, E  R9 @" r$ I" s//upp接收、发送buffer3 e- d* _8 Z8 }
#pragma DATA_ALIGN(upp_buffer_a, 8)
4 w, {1 |, G7 Y) Y  v$ S6 e+ w#pragma DATA_ALIGN(upp_buffer_b, 8)8 x) W$ `, }* t7 u
3 Z  Q3 T$ v: X8 d2 V# K+ }
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% N  n  }! d$ T. c7 e- B
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
& \( P1 d' h/ O! F' |6 M! R! w& a# N2 G
3 g3 s, Y. g/ U
static bool server_upp_data_recv(Server *server)
) D' h2 r) X, ^; K) v5 d{/ b, N. L. p6 l+ h; w! ?- S+ A4 k; _
    if(server->upp_channel_a_recv == false) {
/ _' v/ N$ m$ ~9 A! T2 t        server_msg_send(server, APP_CMD_LOG, "upp recv: start");  E2 _7 y& R6 F- X* P1 h
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 X; ^# v! ^1 n+ ?
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");: f/ e8 }6 X$ [; U% Z
+ {" E$ a" E3 U" V8 f6 s

4 N5 o$ P. M6 T            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' j# R5 J- s( R& m6 E6 U& q4 F; C6 j8 ?, j- O
            server->upp_channel_a_recv = true;//
" X$ f" V$ ~' e6 c7 h            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
; y9 A' N: L% A. ]9 C7 |* I3 X            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
# Q0 }5 m. k$ ?' V2 n            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. ^$ D" [$ D% |$ S$ |$ q; a            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
2 B$ L  c5 _% U8 W$ a( r8 F! J! h+ `$ {0 ~1 u& S- q2 ~
            upp_error_count = 0;
( j- j, s* L+ G3 C' K            upp_dmai_int_cut = 0;' R! R' G% t2 K- |
! V8 z. b" M' B9 c
            // fill in data $ y/ d6 E4 ]$ g" ]
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);& B& u( A2 p0 H8 T
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% c# A- D& j3 f" _" R; ?        }. l4 m$ P" }7 [
    }
; ~, k9 ]& ~9 o& `& l9 d3 K    else{
$ P9 |5 t4 C% _. F+ h        if (upp_dmai_int_cut > 0){
9 F6 Z0 ]' j0 e) U: ^            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
: Y+ ~& _; `7 U0 s+ p/ P5 n# o6 ?4 [            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ F5 D/ `3 B, m1 ~1 n
6 S! Y6 a# J0 A$ i7 A0 V0 \3 q; }' i
            //copy data to upp_recv_list_busy  A8 o) |$ G! i0 O0 v' H$ v0 d+ k
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 w' K4 X3 M5 Q0 B
: z. s7 C7 f  p* b" e; V' F
            //
- l4 }* s5 Q" I, p& m% \: |- t            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 i" q' I- x7 O1 n! }; p9 v' o8 {! Q/ K6 N; H$ |# j
            //, d# C! V% T+ E0 M" O3 m* h
            server->upp_channel_a_recv = false;//
/ ]4 U& |6 |' N) g. C6 D0 t, d1 R8 d3 O9 D4 |
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 ]; }+ X% x) ~# F, K$ u4 t) l! C        }: q3 X- g/ l$ S
    }4 d0 A9 c* L- H& n9 B0 t
5 v6 L( A% }; Z

9 t/ D4 v0 x0 T    return true;
2 g" I# B4 M# v- `}- j1 S9 d3 A9 @* g0 a
- C: z% `) d2 j  O6 L$ I0 p; f/ P
static bool server_upp_data_send(Server *server)
% @5 ^& a& ^+ B{5 P/ S' l* W1 r+ J$ g( d0 g
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% Y. |7 T5 [9 R0 Y! o        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
/ |4 H# H! i" M1 u        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ j& G" H, t5 G2 ]( N3 U  W. x+ v
        char tmp[128] ={0};
- q7 g. p+ b* |& z9 R, n) |/ B1 U( f' e- J! f+ c7 i/ M, x
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
9 @% g4 K% U" [7 H4 C        print_log(server, data, 64);
, [9 @# O0 j  [. _3 C: G
9 \/ ?+ O8 ]7 ]5 S2 i" A        //2 s4 k+ h7 O* K! r
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ ]6 b' }; f: t0 b% b
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! o; O& i, e/ R        print_log(server, upp_buffer_b, 64);
2 Y/ }0 w9 N3 y1 G# T4 _2 d' ]) u9 i% U7 d. s
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
4 R+ }$ c& Z  m8 V  c        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 p( L: J  x  t2 i; q# @        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; i2 B$ B. `# ]# i& j  ?% t
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# x0 a+ S7 F" c* S) e% k: H' d2 b: U+ V) s) _
        memset(tmp, 0, sizeof(tmp));1 p4 ]4 H8 r: `. @9 a, M6 J
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
# \8 y* e* ?& |            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
* V- h: E7 \8 ^4 _- D/ X2 a8 W! [        server_msg_send(server, APP_CMD_LOG, tmp);4 J6 x9 a: R* {6 l! U
: [+ q6 ]5 S% n' A( ^8 p
        upp_error_count = 0;
  Q" W/ J4 F& M        upp_dmaq_int_cut = 0;
  o- N# w2 K! H% b        // fill in data . W$ c5 y, n: o! t" ^
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ n% G& U! v+ E        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");- d7 d- K- D/ A, e2 X; w: `

! Y1 D) f0 m" J$ r  I9 b( V        // wait send success
7 Y3 Q2 W0 f- q. ?! K, o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 f9 V" k3 k& p* _& F! j& C1 r% B5 B8 D  }
        // make data node in free list : [+ N( l9 G7 u2 j( D0 j) b
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 k0 s4 h* F% M/ G! @( a2 ^: K        server_msg_send(server, APP_CMD_LOG, "upp send: success");3 M  u' D7 z3 P# H
    }
) _0 ^! a' \& }; Q, ^5 k    return true;: N8 D6 u! E: F: o, j" [
}
/ }1 W5 K' C: C) J7 O- M: D# R
' D- m2 n/ h% ]8 O# ^
2 S6 b6 n9 {! t( J6 L: ?
* i* w" Y# N8 D2 x! C8 I7 S  ]

& f( r4 `3 {8 V& V2 B& d  D  m! h& a9 p3 u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
% O9 D' y4 x6 c9 d7 s
7 n0 |7 C3 i' q3 A8 i2 P" ^8 _4 I

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-17 11:39 , Processed in 0.044276 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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