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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 _+ y, E) R9 F- O0 j
2 `! I6 ?; V% u: D+ t* }
问题描述:
% M8 T; [( g: u在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 v% Z; u# X8 e
1 u2 R1 U& i- u0 m2 E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* y1 u; @, }/ h, F  ^) X% I4 e( E* d- |. T! @- K2 [* d# e' E
测试结果如下:
5 F$ T5 z/ j% w4 I138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
* T" K* R5 g* v: \7 ~$ o- b: m% r9 W1 z
8 M6 l' d9 n$ N1 M
备注:4 j' E; x3 ?0 P+ [; X' N. L- w  H
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- h7 A8 K  ^* @
2、相关代码如下:
$ d1 ]. e, B8 Q, h- [+ ~" M//UPP DMA缓冲大小512字节
$ f/ j( ]- z7 Z#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: d4 k# i( W5 L2 @# e% w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 e& E* I3 F8 h, X, Z$ K4 X- Y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, l' t+ |# a4 x* e' s8 z. J4 X
! t- B6 \0 `" v& T" I9 Q2 @7 ^( ~. k, ^: O  A4 B) M
//upp接收、发送buffer
4 g9 S2 `6 G4 K$ w) L#pragma DATA_ALIGN(upp_buffer_a, 8)/ Y& R, ^# f+ |
#pragma DATA_ALIGN(upp_buffer_b, 8)/ c$ ]3 F, @: p! P

* e& x+ ]* D2 I4 H4 lunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 b2 n* ]! c' r: m+ U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( a/ Y- ^' M' |% j. D
5 Q9 @) D. H# W' Q1 [) X& t3 S+ f& F  x7 L/ ]) r
static bool server_upp_data_recv(Server *server) + o  }5 z& L  Y: _9 c% Y3 g3 }" P( z
{; G5 ^, o) A# l) U9 r7 j
    if(server->upp_channel_a_recv == false) {
- `5 p" b4 V: f3 p        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 A. [+ ?5 o) T' j        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 ?1 _( p: u  V; c: K" Q. h
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' s. ^6 N2 e; e* @% S  M2 S2 X, p

9 O" Y$ N3 X9 |; i) k# q) s8 s7 Z0 O5 O6 N5 u. U  Q  i9 T
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 w* J9 |& V! i0 d+ M
: e; s  w$ i9 O, E' d. P
            server->upp_channel_a_recv = true;//" E. `% L; o1 _
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);) Q) w0 w1 ~) {* ]; a4 |
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
. P1 g8 C% K' C( e& s            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
0 d, V: K. J( Q: B( n0 T            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! N( |, }. m$ Y, T
( b, ~( ^, ?0 ?5 Y! P" c7 o
            upp_error_count = 0;
, [& c$ w: M) t8 U  D            upp_dmai_int_cut = 0;: }  U5 n' f: H( F( e/ s
2 t/ d! P0 \+ d: R# |- ]7 b2 {
            // fill in data
) G9 w" q  n+ g, b4 N, J: }: s            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
) w8 R0 q% V6 |, i            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 \0 o# S- O8 q4 `        }
( @' T; }& |3 ^! B    }
. ]6 `! l* i- A/ d& N7 a8 f    else{
9 ~+ n9 Z# D6 S$ ?0 Q        if (upp_dmai_int_cut > 0){
4 u4 r6 ~8 V, \1 Q. J            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! F+ s6 g5 J/ I& q
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; w4 y: \4 ?! m$ N: @( v, {% O* G0 Q" n+ d

1 @. O, B1 f- P* M- O' t) m            //copy data to upp_recv_list_busy# V9 `& |0 Q) J: [# _) ]
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 |. F: G, `  d& G* I4 L% g/ ]
9 f3 i# x) X, W: r' Z" W            //
$ Z! p2 k. Q. E8 t            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ {( k' n* L9 y; y1 ^

7 r* `) f! G( s# B9 G            //
; S; g' Q7 w( |: [. Y6 |% H. g" I3 c5 K0 v            server->upp_channel_a_recv = false;//
- a8 _5 ?# F; K6 I* Z$ l& E$ ~1 `1 ?
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");) c( |% U+ d0 Z
        }
- D$ T, g8 A+ L$ H% W  I    }+ w& L. ?$ m4 @3 t

1 X7 j' k4 [+ N$ t' P. w& F" t5 l6 A7 X3 r$ `
    return true;
, a. t9 q  ~* w. s}# O! k6 a" O/ J* B

: K7 H! w0 l* L' [/ a3 bstatic bool server_upp_data_send(Server *server)
5 ?+ J! N# o+ _9 y  E{" v1 l& e) Y5 E* C. x8 A6 P" w! z
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! ^$ F- w% N1 X% k7 @
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
8 X- a. o+ O1 }        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
! L/ C' M- Q* E, E        char tmp[128] ={0};
% u  L4 Y0 I$ `& l' P& e
( X6 |( E) B1 n7 t        server_msg_send(server, APP_CMD_LOG, "upp send: start");+ A: v3 O6 N" D/ A8 {) ~! t5 W
        print_log(server, data, 64);
' v* A3 C! v, o% I% k5 k1 X' N
$ |( C" h: T' I# q7 \0 t6 [, S        //
/ u5 A* ?, p; a8 `        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
7 X1 Z3 f5 M/ u. C4 L- x+ q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; Q5 ~" k, A' Z1 {; z
        print_log(server, upp_buffer_b, 64);
; W/ h/ L, @% _8 g0 ~
% r& i, ?/ V7 H8 Q        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
$ X4 u: [6 n" @! q        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
! e  ?: c1 S  }        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
3 z* T) g) v1 U  T        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 a6 F4 L- E6 k9 H, a) A; l" M! h
        memset(tmp, 0, sizeof(tmp));
8 y) {6 m; l- B  x( u        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! B# u. Q  ~+ j  S8 }2 @            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ H; z: g2 M* \4 R        server_msg_send(server, APP_CMD_LOG, tmp);
) I, s! B: p1 |& T) r8 x% d% _, S" \+ ~6 A: J
        upp_error_count = 0;& z  d2 N: X; Y- Z% k
        upp_dmaq_int_cut = 0;
0 M8 o+ l5 [' g0 o- ]3 j9 S; V        // fill in data 4 v) L3 ]& A& L2 o" v; S1 w
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   t& |+ x0 Z* \* n# d3 g
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% ^' V$ G9 B8 d2 q6 x

) P0 a4 r5 c+ n        // wait send success% m, J& w$ |! M& g8 l8 W! @" f
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
" V7 x5 h& p" v
' t9 z# b$ u# s6 H4 P4 c        // make data node in free list % K% \2 x2 y$ x# n- h; R6 u% I
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
8 U+ O& a* q2 i        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 Y# Y. M: {1 A6 O! u1 Z- \8 R    }1 i/ l8 \+ e2 R/ U* ?% {3 x% b
    return true;
! K- w/ {8 z. v) s* I! I}
2 r" D  `3 a; ^" W" L, u5 n4 ^: E& C9 ^: H1 ^  e

8 w, w7 O4 ^3 i$ [8 h- {0 A# P1 y( {; C& s
; I- j0 G9 b- w+ Y

9 S, Q% L, A. z6 L

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* |3 ]6 K4 Q7 ^! @2 [
" X- r; @6 u& d

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 18:23 , Processed in 0.043836 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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