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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- e1 W' x6 f' v* r) ^% z6 ]: i7 z0 x8 u% x0 z
问题描述:
3 `* E1 o; ]; D0 b在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
  O, e- D& T& t5 g  ~* z) u3 T- Z( C8 q1 Y" [: {
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# {4 H8 |7 e; k0 j% K0 c* D# v+ J! a
测试结果如下:
2 @2 i; h! ]9 X8 b2 A138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( }3 O; c8 l" Z4 l% o3 R. Z0 D) k- f: N$ l9 J1 \+ X6 i6 t

! W& C# }5 V: G备注:
( E5 s: `% U0 f3 Z/ Y  y. ?0 a1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?  P6 V+ H4 e, s* ~2 F8 D1 `4 x
2、相关代码如下:* t; |( S7 C/ @
//UPP DMA缓冲大小512字节; v) m7 s5 d5 \2 w
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, _0 A) O: @% u/ F1 b
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( x$ c1 f. m  x/ z& }
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
! F3 r: N) X/ ^, ~7 N# W5 B. y' Z% Q  }0 R+ k+ I

$ Y9 G. V9 @8 v7 Q( A//upp接收、发送buffer
/ u& Z; h. C1 g" q% `#pragma DATA_ALIGN(upp_buffer_a, 8)
. l: b4 P9 E8 ?# X1 x' J7 u6 o#pragma DATA_ALIGN(upp_buffer_b, 8)
& i* p, s% \% K; a* U
# P2 G$ F1 B( M* I) |unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];. ]$ u2 u# {7 r4 w5 f! n! r
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
5 u. u6 V  _2 B2 e1 Q
% K6 M# Y2 f' l- U
! z; u+ v# ^! u3 t$ ?/ F+ ^- Ustatic bool server_upp_data_recv(Server *server)
( x: Y  F5 n  p: `+ Z3 S0 v{8 d' ~( N) `2 w' S8 R. P: t" I6 G
    if(server->upp_channel_a_recv == false) {& n9 D; f* A- \* Y9 i
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ c0 y' u& ?3 h9 m7 R1 e        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
6 g9 c" b0 r: b  J: b; Y' f            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 K/ V+ C% f6 o( _8 O9 s
4 c+ y! k+ Q5 C) |  g# g$ z, m# m8 \! `
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' z" C3 i9 N6 k8 H! x' V! L3 y2 Q+ [, h' }7 z5 }% ]# f2 }
            server->upp_channel_a_recv = true;//
9 K3 U9 Y4 F+ [, S9 T            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);/ y# G& s8 j" l: I- A
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;+ Z2 M. O& z  V5 x% s- ~
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
& V6 n! U/ O0 ?9 Y            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; e1 \) B- V% O. O+ }0 U9 S
; ], \' D6 Y0 ]3 ^
            upp_error_count = 0;
4 f$ @7 l1 W$ `8 J            upp_dmai_int_cut = 0;
* Z3 E/ F8 L# a  Z! T
* u0 \' Q+ W) K) _# b0 P" a6 F! u            // fill in data $ a  d" F( L* F, f" Z5 [; w3 d
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  K  q8 L" o, a% d- ?0 T
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
3 @, e' K9 ~/ r; O- I5 ?        }1 r" ?2 s6 N7 k% H
    }
. e9 Z$ d6 ~  k, `  {: c    else{
  d4 y3 _2 v+ x. _! I9 C        if (upp_dmai_int_cut > 0){. D6 k1 ~* u! o7 T; v
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) v/ B8 e: Z+ ^2 U6 h$ H            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# s( k/ U; G! ~$ u" |
+ t+ J" Z) {2 ]
8 V0 y: R  f8 g0 Y- I/ V  }            //copy data to upp_recv_list_busy
9 P5 D, d) V3 v& t0 L3 M- T            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 K+ s' N! m* l& u& h3 @( v
2 x4 V) H3 `8 `
            //
1 L( D& o8 D3 F. A/ ?, h2 Q            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" U  H; Y7 l9 Z0 j' n+ x( C& u5 c) D# D# a  l& h
            //0 C% F2 e* s- Y- v
            server->upp_channel_a_recv = false;//
: J1 V$ A3 n6 J( T7 ^1 ?7 T8 [
& {* N! W! c, ]; ~0 Y* s* s" r: m            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) i) U0 B' b) i( X1 i* A, W        }  s! |' i2 m: D" I
    }1 {+ w7 w2 t# S, M

  t' l1 [8 s3 M2 {
$ Y) j1 h7 a4 d, k4 k* e+ P    return true;" t# X' E2 j. L" k. k  l. y4 c- ^
}
7 C! M; g7 M8 S$ y# e5 }' M! T, d, `
" F. c$ Y$ h2 y- d# s& Ustatic bool server_upp_data_send(Server *server)
% V9 }- v2 x4 X1 Z{; A  _; \( \' \* ^" N
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){4 l) V9 V' e. y3 A2 }* j
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; x0 K  S" g' s) u' t2 @        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. [8 M% }) D7 \0 D
        char tmp[128] ={0};" w% T( K) ]0 B

: J3 e8 `4 N: l" t- y0 p3 L( t        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 m2 a; F" A: r3 g/ B0 t' _% J
        print_log(server, data, 64);0 W3 J% s; M( u  ^' a1 }

: x) D7 i* g+ n        //7 c& o* Q& j  U5 }7 H
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& O# K( U4 n$ A6 k! w' Q- O, V- z
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);8 H6 Z2 f( O+ E  n
        print_log(server, upp_buffer_b, 64);
( R) ?3 f2 ~2 u0 N7 |* @- G* i5 ^  P) g8 p! v3 v8 A; ~
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);" |& Y9 k- ?0 @3 O$ D+ o8 Y
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 4 d% P, d( s$ Z- a% N% g
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;, U  g$ {. k, l' g$ i
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
+ Z% W' f' J7 m/ \9 w5 W/ z9 D1 \/ Q
  y1 r, V) D/ C0 f4 [3 F        memset(tmp, 0, sizeof(tmp));& u- Z; ]" r( x7 N
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", / g5 }. Q' F- s% Z, x( m9 x8 d
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 C3 @, c/ a+ i& O/ h# Q. Z
        server_msg_send(server, APP_CMD_LOG, tmp);; s! `2 Q1 E- c$ h" A7 E

8 X4 r% X* F& S2 \* t# Z7 y        upp_error_count = 0;
& J( h5 x0 ?! V0 M4 L% a1 O        upp_dmaq_int_cut = 0;: j" q* w; i7 q7 u! u7 D5 b
        // fill in data / z1 f: }; W9 j- \5 K( r+ K& Q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # F. X# H& E3 s
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 H: w+ ~! o+ E' D3 }) Q7 h& b8 v" q) [" O+ ]: g4 B( T
        // wait send success- e7 N2 n3 k& _  ~" S8 v. {; t
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : S% _1 E( f9 L1 G' J/ x* X; f1 a

: F/ W% t/ [: Z/ ]        // make data node in free list
8 q' O- f" |* Z$ u# M, f- z/ P        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- L4 \) h2 T$ a% ?+ p
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) {( U2 n9 v- T& E! s& Y" B0 m    }
) X  l6 v% f. t' M0 B$ d    return true;; c5 S& a. a7 m  ^0 ]- h
}
% e8 h9 H4 t" a: N% D& v) C+ `7 j! b  [9 p
9 i6 A$ N, Y. z% @9 |

4 K5 g6 k! r; ~& o

3 H2 [) O' j& n7 M4 }
' E: o3 C  o  J; ~

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐+ a; Q1 e% h, ~2 k- m2 s! ?- g8 q
4 U- M: W  u+ @  Z+ Y5 {6 L9 F1 s

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 17:40 , Processed in 0.040527 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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