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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 * M5 }) z  C2 P  ^* p) d6 Y  t

) ~4 w0 X3 S7 y5 m( k' g9 K问题描述:
9 a& [: G" X+ O在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 f" _- ~, Y5 N- h

: l* n8 ^$ o5 g% I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' m7 ~6 A2 Y  g0 \% v8 [9 ^% {" e

& ]5 z6 t* {0 W" ^4 K测试结果如下:
* X+ i; Z% P4 [138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 o6 q; f8 W3 c
6 B+ P/ D* }* z8 w  g# {3 u( z) E
- A/ R3 T- a4 c, v
备注:
/ L; e; J8 W% D% N' M2 y5 e1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' n, M/ G( c8 |+ b  s
2、相关代码如下:
3 M% o# ~7 O+ C8 v) y//UPP DMA缓冲大小512字节
6 P: ~; ^8 w' K0 W6 N1 i#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ A: E5 Z# H3 Q#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
) O8 K) ~6 o/ }& L#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); t: i9 W+ y3 m; i5 {0 d
( n& B. o3 o6 n% ~
: g; q$ b* M( G: M0 Z
//upp接收、发送buffer* Q( b. `0 y' n& [' X
#pragma DATA_ALIGN(upp_buffer_a, 8)
& x& `0 z* d& a8 p% D- I( _% w#pragma DATA_ALIGN(upp_buffer_b, 8)6 a9 m3 a0 Y* B& h( j
5 Z8 e# d$ _: L9 z7 _; A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ U9 Y1 h* P; ^( {+ z. U  R, Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( c, G% N% f* s! [
0 V. R$ H$ x9 e* T$ Z; m4 s9 I

/ v& _& `" H$ g0 x# m  a: W1 Hstatic bool server_upp_data_recv(Server *server)
: y/ {3 E) Z9 K{* h) n3 M6 V- F+ a; y
    if(server->upp_channel_a_recv == false) {
6 p$ s; H7 H+ l8 _6 m! F        server_msg_send(server, APP_CMD_LOG, "upp recv: start");9 E, [* L- P) I
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 p) O: [. j3 ~0 Q' m6 x4 X
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* O5 @; a! K  n3 f+ D$ U% |

9 C7 V8 E( q; m- ?' L/ C: W, W1 p/ E- \1 v6 V. {
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ }; o- ~8 X+ d: Q) Z; q2 Z
- {4 f% g7 s! N2 a! {            server->upp_channel_a_recv = true;//: I4 z! k3 m. g- a. F, M* v* Z8 X  Y
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);' U7 r8 e4 }3 j) W
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;- ?$ j) X% H  w, M4 m5 y7 ?, S! A
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
: [+ [7 Q" k( }7 s/ t8 I- q4 Y            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 T5 A$ A: _$ ?$ a7 P

! O! _. f# ?- z            upp_error_count = 0;0 C7 v; p9 O, M4 B- N3 J2 Z
            upp_dmai_int_cut = 0;& P' W, G" t. \9 K; B# Y

, u9 [+ d3 u0 ^: J            // fill in data
* B/ M. o1 {7 r/ W& v( v% K            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);0 H7 W* }, \; I8 V1 t9 m. s) e
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- Z* b, S8 S7 X- q: j5 E        }
- M* v+ q0 b& S    }
" @) ]; h7 C- h+ b" d    else{1 n9 Z# y0 N/ @5 O0 a$ R& o
        if (upp_dmai_int_cut > 0){
& A. {* P( J1 ?& f* O            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; G) ?' _! w7 `" t9 V
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& O" B9 \+ x" ~$ h7 r
2 M, i& Z8 \+ x2 H9 t  q; Q/ T6 f4 b& C+ d
! v- K5 u0 n3 p9 Q            //copy data to upp_recv_list_busy1 y# |" c: m/ H& F( c
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, t! O, L+ d7 w3 y4 V  M

; `# O1 U# I$ L0 T' t5 D2 ]            //. s  C  G& U' K1 P8 W  e
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  J6 u) v0 D5 v2 A! ^" M- ^/ f
9 a  x5 E- L9 c
            //& K* E7 j) N% V; W4 U8 e" C+ J
            server->upp_channel_a_recv = false;//
3 x) Z1 n7 s/ V
/ a1 l: P* G+ v            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
9 p/ i# O+ g4 W; b        }+ @3 q5 a) s2 `& H9 j5 f
    }
3 g! B/ Z+ Q3 |- g, G# K1 r3 f: l" _' h& G# v

3 M3 e1 G) ~: R  l    return true;
+ ^' {* E) B6 L# O}. l0 E; Y" G2 \( U: k% \5 q. A
- e6 E& V! Z6 p1 I3 w: ~
static bool server_upp_data_send(Server *server)* x  R& {: ?+ @  h
{* W6 M2 _9 J/ I3 U: s/ @5 v
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' }; g' w, ^9 A6 [7 y: P/ Q        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 X+ l+ l& I. R$ T! p6 T        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 ], ?6 L5 @9 D1 ]
        char tmp[128] ={0};
. E  I* [2 |& c/ X
  k- x! _9 J: A. C2 y        server_msg_send(server, APP_CMD_LOG, "upp send: start");
' `9 E) i! J( O        print_log(server, data, 64);; a; T: g$ p8 J7 O2 z0 b+ g

" o- C0 \# g" \" p+ U0 K        //2 _4 H) f% d8 C% ~/ W2 U7 t
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 {: D# y/ `0 D9 d" z) ~0 Q5 {        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 |) l5 ]9 g1 l& g% H, J        print_log(server, upp_buffer_b, 64);$ a0 r* T6 x; O; Z

$ O0 l3 x% E4 ]; P) Y6 V        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
' s; F& C6 `& o" L" z3 C4 K3 j; u        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" J6 D* F7 v5 E' |5 p/ F6 A& [        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
/ u! G' v1 {5 r$ v% \2 K1 ~        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 {& w) y) l8 [9 T( p7 o$ Z
2 Y6 H5 [6 K- |# i, W9 Z8 Q8 o
        memset(tmp, 0, sizeof(tmp));
- n/ N: X& ^. U& ~3 T% ~        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: ]8 ]; i1 O5 V. k1 M7 Y7 p            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
4 N  w  e. x6 t- r& }/ q" e: G        server_msg_send(server, APP_CMD_LOG, tmp);
/ ?! B8 p$ p2 F. X% X4 B8 x, w" \8 H$ G
        upp_error_count = 0;
9 T  t/ r1 }5 J1 H6 _. Z3 j        upp_dmaq_int_cut = 0;: u7 H1 R! M" A5 [) T
        // fill in data
- U7 ^6 h0 K) `1 [& y1 }- K        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ e6 {; M; A& u& ], ^' X( z        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ a" H& g3 F1 D8 q) o+ x

: R8 L/ h8 P0 {/ {& P3 i- q) l6 x        // wait send success+ _/ k& ~. ~: \1 M0 l2 p9 O) W
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! E1 _  k1 @% N4 g

+ E: \1 h3 |6 g- E0 F/ G4 x        // make data node in free list
) l6 `/ L7 V+ i6 s. ?        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ l. h' v4 v& z. d        server_msg_send(server, APP_CMD_LOG, "upp send: success");
: S1 ]4 A9 y, @( S; C    }
1 j& [0 N- @1 w' P" J' d# L    return true;
: i+ E. N/ n# W9 @% V: @- i3 H}8 q& {( P2 c; d' d' a9 ^
3 D) C$ s/ G. O7 Z- s
2 y. t* f; g! f% o
! I1 a8 B6 V8 [9 Q' f- b/ @
; K& H: [( p  U5 P
6 ~+ x" R; Y8 e, C0 f$ j

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: C( ~( d- x7 G$ {( W
8 p( h( D5 b' T1 {

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 01:19 , Processed in 0.044300 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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