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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
  _. A% _; `) l6 J1 p2 y/ S) f0 ^' K; @# x5 B
问题描述:' ^- P& |/ d% C/ U9 B: S
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 U7 o( y$ q0 z8 P% I3 b7 v

# t$ ~3 U" j* [, C图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' }" u8 f* u0 V  Q  X% H/ p% g& e( b' v+ h: {. {+ |
测试结果如下:- k- o  l/ J9 o+ B$ W( S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* v, j/ t1 C* h( ^

+ B( v8 n- y3 ], I& b9 L+ N# N7 G+ n) q" e
备注:# A0 W8 e1 G6 E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 G- l! r" ]2 o" J! {# d* D7 w
2、相关代码如下:# ~3 M% C0 Q. `: }
//UPP DMA缓冲大小512字节0 F! Z+ O- b& C, c: G2 ?9 n
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) X1 D/ ]2 d5 {# [
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' T/ j: u5 M6 m$ D4 P% c7 x( N
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 K7 }1 y. K" c# E; j

4 F9 I# o' E% L- r6 F* ^: S5 T7 H, J
//upp接收、发送buffer
" n) P7 ~5 [: U8 ?; s8 e$ V# B#pragma DATA_ALIGN(upp_buffer_a, 8)* j, g4 h0 `% R7 g* m5 M
#pragma DATA_ALIGN(upp_buffer_b, 8)2 v9 U) m4 ^% K1 [' `9 V

3 g( w& o, S$ G! [+ Tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ }! `3 ~& O$ I( o8 junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ ^  c4 m$ T5 z' ?! ?

9 f+ \/ Q5 Z6 f6 h7 n9 v; f
8 t) a: T; h2 S$ R6 i  Astatic bool server_upp_data_recv(Server *server)
: e, ?8 D! w1 E( E/ [{, o6 x3 L3 r& a- t; B; w9 i
    if(server->upp_channel_a_recv == false) {
; n+ k+ P1 E# ^1 j7 W" c/ ^        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 c/ y; z5 _8 o" ]        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: w( S8 L: b4 t8 U
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");7 B; Z& A. ]9 N! Y3 Z" k: f4 S
2 ^! x, M4 L0 |/ R! S
. S; t: U$ G1 \0 a2 w
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);' n! p7 [! P9 i7 B
  k. b% i* v, K7 q
            server->upp_channel_a_recv = true;//
9 J0 Q7 o/ E( R/ w+ F2 f) l            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);0 N6 Y( B9 v$ W9 u- f: {6 ]
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;9 c' S( r8 E& [1 x9 {% T
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;, X0 ^* a, G2 I' W
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% Z" P5 @, A4 m  O  V- _* j5 h& E
            upp_error_count = 0;+ e. |4 |) `9 S7 {* H
            upp_dmai_int_cut = 0;
6 q9 }4 P- t% Z0 _. m! W2 u
' k( k+ i; R* d9 W% m            // fill in data " U0 M& \; q* t+ W5 q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, \0 V& G% M( ~8 Z0 p+ R            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, a9 D  ^5 K# H1 k2 y0 A* P9 c        }/ r' x: m% c/ T# V- y* m6 V
    }; f5 O- j* Q# S
    else{1 M7 r% i8 D- ]) [
        if (upp_dmai_int_cut > 0){: d" \1 c% d) N5 b% @
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 W3 L( K( D4 I( ^  S            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
8 K. G: g1 S1 y8 h; n# y. r: n6 A0 P. e) o! I, N
4 N' _; C4 r9 x
            //copy data to upp_recv_list_busy
$ f& ~( Q# R( T6 ~            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);6 R3 x- L( f! T2 }; V& B  o' r8 m
  W" r8 N; X# j, r
            //
$ L9 g: n; C5 f2 e- i: n            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);4 h. p& h! I- J# F3 u
5 M$ h. K7 `* X8 N3 W
            //
0 c. L( d+ w& u/ w- r0 k1 n            server->upp_channel_a_recv = false;//
8 e  o. z8 x  L* n( x- I4 J  b% g1 O# ]% z+ N9 X  v( X' l/ o
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 y" ?7 `# k( o( Z$ p8 T        }
/ k2 }/ U; f5 K    }
0 ?5 p9 O% k% @. q; l2 F
7 ?4 u  [* Y5 v
: w( n& u- [3 n1 D( l- l5 K% L    return true;
$ u4 p6 D6 x' B; i}
* m2 S% B: I5 j
/ u* t, T  ?- K, U) a; D: L% Wstatic bool server_upp_data_send(Server *server)
2 {4 [/ k* P( v) _' \3 P% l; H, @' ?{$ W2 f. G% z- m; J8 `$ i% d* W( f
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 a' w7 _2 j" j: S3 s" |+ O2 ]        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 e' T$ B. `, B0 D% j
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: ?9 c, V/ `# ~3 J. X9 g3 B
        char tmp[128] ={0};
6 {' i! [/ q9 D# c" N  ^* x+ B
        server_msg_send(server, APP_CMD_LOG, "upp send: start");  C" S% ^0 o! @9 M* q4 V% D
        print_log(server, data, 64);  l8 n# t  n5 K+ |" x

; [+ M/ Y' O( P" a/ Z# J4 G        //5 Y1 z  K( X! e
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% A- F. |2 \& k- Y5 D; D) }! B* W
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 D7 [3 Q/ h2 m$ g        print_log(server, upp_buffer_b, 64);
# o# L- A/ k; ], B9 y- X) i' I( Y+ V( g
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
5 l+ s, \% l( b& N        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 2 ~; r* Y. o6 F; I. H, [) G! i
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;, l/ ?% A9 H8 s/ `3 W  S& f% `7 f2 A4 V
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ {9 _2 _- a1 s

1 F# E* P* ^6 [        memset(tmp, 0, sizeof(tmp));6 ~" ]5 F4 V8 p2 k$ |5 y- [/ @
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: ]0 N' C. k/ X5 Z: f! R6 G            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);2 Y6 s7 u7 F2 E. `
        server_msg_send(server, APP_CMD_LOG, tmp);. h4 Q$ E. K" F& z& o& a

; `9 N" |2 X4 V1 x- w9 w& }( @        upp_error_count = 0;
. Q/ e3 g! t; a4 O: R- A$ I        upp_dmaq_int_cut = 0;
. t" g- e5 `6 E. |, j        // fill in data ' ]% ^0 r1 d3 K0 _) @
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; e( L. o$ L& J& W; W        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 x- O7 C8 b8 P
/ [9 v. Q  F7 }" j3 z
        // wait send success
! f. ]6 k1 a* A( v, Y6 e: }7 [        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 {+ l( z. j% v8 g2 S% }* ]
) G2 Q9 R( F( Y& c
        // make data node in free list
# k" _0 O7 q8 V" k3 |: c" ?        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 W' [2 ]1 X6 T        server_msg_send(server, APP_CMD_LOG, "upp send: success");. c" t0 _8 D$ q" u/ k3 S
    }
: Z0 K) n9 L, K    return true;
( P3 K( a  B4 b/ m# q0 I}
7 P0 @9 Z( e% C, w* G9 m: ^9 c, ~" }/ O  r9 j! g- s0 l& Z7 z" ~7 ]
/ w, ]9 R$ m' q. i; }

3 p3 G/ F( \" {: A9 g

. h- z7 K, ^5 @, e5 [* q# B' g/ G2 h. ?" x' F

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
4 P5 z& K9 m0 `7 `
& c! m) v& d6 Y9 @9 k

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 00:55 , Processed in 0.039257 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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