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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 G/ W) C" }: _7 e
; f6 F9 T6 t4 l/ e
问题描述:- n; L7 _8 I$ @: V7 m) g5 E
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:' H7 Y/ S$ T) r! ^( \: v6 l
8 k, U& O  T: ]9 I' H- R6 k
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。% f1 M0 o1 r  k# d

2 i0 y3 e  T0 V( B( m测试结果如下:
2 Z$ ]. H) ^" p- v' r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- ^  i9 j& z. U' N/ }" ]
6 Q) U2 }. S/ `! ~3 z$ Q( ]( P( |) u2 k9 d9 D
备注:
: t# @( t- D' L# E8 ^* u2 b1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 v4 {, T9 g3 {6 [% e
2、相关代码如下:
" k& f" @* z' z& W2 L//UPP DMA缓冲大小512字节
6 B0 o" S0 G) z- Z' Y#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ K" r- m. @$ F5 A* t& B6 Y/ B" {#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# K4 s% I( D' c# c8 E#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 G# Z3 |8 M6 g6 V

/ u  G4 e3 Q$ n) B! t/ O  z' Q" I
: l& j, P, N3 ?2 a0 B//upp接收、发送buffer# u9 [/ K  J* N/ G3 o3 V; v
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 ^  ~5 u( X4 k0 r#pragma DATA_ALIGN(upp_buffer_b, 8)
8 L5 b# p5 M4 ^- J0 o& y- N7 f% J
' z2 J; v/ f! m% ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' C. E4 k7 Y3 h; c5 iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, U8 B# Z+ Z) ]; _) O" f6 C

: y& a( k' ]7 b: g
" E, `2 g/ A2 v+ f: I( ~static bool server_upp_data_recv(Server *server) 7 S# Q  Z& ~* q, C- O1 @
{
% [, h# q7 `, F9 r) n, }3 G# ~    if(server->upp_channel_a_recv == false) {) O( K5 t6 v" @* x3 m
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
  {( h9 S. D7 X; G9 }4 S& T( l        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! G( `( O( Y" H$ p0 d, Q            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 m: F/ P0 Q: R' n6 W
4 B0 t% b& q. u; ?- k' |4 f& S9 E7 p! a2 D3 G% a- K
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 ^6 y% e6 F" N

3 _$ ~4 r) i" d# p9 f( M# I            server->upp_channel_a_recv = true;//
; Q& H% e8 Q- q6 f# H* ~# t$ t& ^            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);3 W$ m3 u; _$ y
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;5 O7 D2 C; m0 ?. v9 ~  ^" B
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ u+ @- r/ |( d            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, A: C' y3 R# v+ o9 V( x

# }6 |% v6 l. v9 w- ~$ ?1 s9 D            upp_error_count = 0;& Z2 h& A, J. \7 c( A) }3 b
            upp_dmai_int_cut = 0;) a; ~" Y7 O& _  T0 y: {. W
2 R: K) Z  }' l" S4 W
            // fill in data
( z2 y5 O+ {/ Q' |' S  @7 W            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' l+ k& K) x" R            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% K& Y# {0 B8 Y. P        }
# q3 l3 [# N- {0 j/ Z1 d8 O1 D) t    }
3 d  k0 B  R4 ^: u' k) ]$ `    else{; ]* r8 X4 C& l+ R- V/ {  |8 x1 h& c2 f
        if (upp_dmai_int_cut > 0){
2 [, t# x: b3 }2 y            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);7 @" a9 j9 P0 [" `- ^& U, F
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);: w4 \, B& }0 u/ H$ C3 L1 _
6 g* f/ O- B& I

1 l7 S/ ^& k* g  i2 l            //copy data to upp_recv_list_busy
0 |: X) n& E. E# ~            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ J# r9 [. o: |1 o  y

4 S. W! ?; }& b            //
* s6 I- j, ?& D' W; F* w$ Z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);0 H" z3 I& o' Y7 _* Q
0 W8 u6 p+ `7 l
            //6 g6 K& M# b8 a1 U: q
            server->upp_channel_a_recv = false;//( P( x+ }* e8 Z% h/ `

9 s  \: P9 k' `' X2 L6 a8 c, R            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* @4 f& Q+ c8 Z% v. i8 u        }7 [7 H7 A/ Y/ j& a% ?/ |: h( F1 e
    }
/ T$ G# K% u7 ^. N1 T: ^
+ w4 ^4 ]5 J0 b% E. N9 L3 r1 x5 Y& @+ O5 K1 j) }6 H: O
    return true;* D6 Y% i. u4 }! c6 b
}
. t: x/ j9 A7 T& G; f+ l4 p1 r  Q- i, ?8 e
static bool server_upp_data_send(Server *server)  O" w! v2 R! J) m" G# r
{' L  @3 I  u8 J0 x
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 |, o, T" @" w
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 |- W  E  d! q6 D        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: U" V3 K5 _8 G1 B" l8 i- ?% b0 g
        char tmp[128] ={0};8 o! Q4 G5 p- D' m7 i7 Q
) d0 y& W8 m8 [8 ?% N& ?) j  Y+ w4 y
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
' Q2 c3 F. _7 L7 }8 e        print_log(server, data, 64);
/ j& c7 u6 q4 w& S2 O6 n  U
0 G6 [2 z7 H4 `8 h. k: p        //
" o% Z  ^, S  H" @1 c        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% ?9 _$ Z: ?5 e9 G, v        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& V* L& I, W9 Z0 Q$ t) U5 a9 F: `
        print_log(server, upp_buffer_b, 64);
6 ]) z. \- m( ]" ^
% V( b  |& Z, |& N) X1 n        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
. o% k, ]3 I$ `        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  u& }$ M; O8 T0 U" b4 [/ A        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;$ e8 w" n) g" r- v- Z6 K+ k
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;1 V! p- h  Z* G: W, y- Q4 \/ C
% x0 z7 B8 u+ |2 N' P4 A
        memset(tmp, 0, sizeof(tmp));
* g7 g! [9 }* t- e  @1 q, _7 c        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 H* H# [9 h  F, L( {1 |' W            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
  S) Y* K" M* S3 ?% A' Q        server_msg_send(server, APP_CMD_LOG, tmp);; u, }4 F) A  r7 Y, L+ |
, t5 d- t$ ~7 |6 R2 r
        upp_error_count = 0;
- m0 Y) B7 }+ \+ ~        upp_dmaq_int_cut = 0;! x( T9 M& J. c  m; N1 H; r. \( i. q
        // fill in data ! W& Q% w. W- p1 R+ {' L% z
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 y* `* i4 v+ S7 j/ |7 W0 O
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 P2 y+ K( d& P6 w
  d, Y, Q$ M8 }        // wait send success  ?( ]/ x; Z& J$ ^& `# x
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + R. a6 g! l  F# p4 V  W& {
0 I, s/ B& `* d0 |% @/ _6 t
        // make data node in free list ' L+ ^2 y' R" p  G  T
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 h( R& E: ~/ a% K/ o$ l; n
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ B. u! @5 t' f4 k    }
+ |" a7 R1 |; [- z    return true;
- w8 a- [) A& _3 F! Y}# Q, D: g* N% x# r) r/ n- o- u

% V: Y7 u: ]; u* t: c
1 M- [/ h0 J- R) m0 F* t5 }2 g% s4 A
: m$ `% G9 @0 n" }& `5 @

+ Y0 A! A% I! E
4 [4 P( a$ Q8 i( ?( K4 J

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
: K) Q+ V) j$ [5 c8 f5 t' @) v5 P5 i

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 00:54 , Processed in 0.038880 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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