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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 F' f/ y0 m: _* `7 }1 _% v; i% t; C' T# W1 x( X
问题描述:
/ D: `0 w2 w  f, z- x/ q4 |在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. u. ~6 S0 }6 s- o2 t0 r. s6 v; k% G8 w/ U  @
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。0 c/ z- c% q9 n' k
# D" t- m4 O0 ~, K+ H0 _
测试结果如下:( J) L; ?: U: L% W
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% P& R; g6 ^; y2 U; G" x* z. N
9 M# J0 Q6 l! V# c0 G
3 @7 \4 n4 ^: D( K, E+ e
备注:
) Z& I: C9 [! M1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ y) V, j/ D3 ^) D: B
2、相关代码如下:
3 p. c$ k# _- I, t. g//UPP DMA缓冲大小512字节' E; S" l% Q6 O; z$ _6 e: Q$ w! p
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" G6 P# l: |+ F( q8 Y
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 l5 y% f8 }) z' F8 b
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 y+ [9 z0 ~* e( `, ~
# _) t, ^: L/ n! g" ]* t

' `' s0 h& A+ `* [//upp接收、发送buffer
& l6 p3 K7 P1 v+ v, ~) J+ \! M#pragma DATA_ALIGN(upp_buffer_a, 8)6 [& J# q& O5 A
#pragma DATA_ALIGN(upp_buffer_b, 8)3 T* Q2 H& U/ w! o
* Z* s& {/ u2 Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];0 A3 v! _' {& i' e$ }1 a! `
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
# l4 g! O. }5 K5 S2 m) Y# z
* a% L9 r! q4 o0 s1 z/ k4 X& g* U7 L4 f; Q, t6 l1 n
static bool server_upp_data_recv(Server *server)
+ t! r5 A/ K& P+ f{
. L$ X  B0 w$ J1 f  a& y    if(server->upp_channel_a_recv == false) {- d+ U' G% A. N# V6 A0 b
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");- R* E0 n: A- `0 Y4 Y
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, i# a( H3 e0 W& `. P( }! s            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 g4 _! e% T. s7 z/ {$ ~

+ Z3 t# |) F7 j- u2 U: r
3 ]6 p& n6 V9 t& B/ i            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 b" S- t' C0 `$ v$ ]- @

& q! }4 M* v" x4 b3 l6 S            server->upp_channel_a_recv = true;//: u$ O5 q+ D+ W" ?8 U1 ^/ G
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
+ h- R, [" f7 @2 A4 X            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;; K/ b1 g1 l3 Y/ f! K- k0 L6 f
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! u$ }1 Z' {# e0 w2 i            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% c/ L. E' R5 G0 Y; U* u
- F- ~2 K, J+ s' V& ~" I1 ]0 g            upp_error_count = 0;
4 h5 u7 X& E' @4 b$ _$ Z. U            upp_dmai_int_cut = 0;( Q0 Z( A2 a4 S1 i: R
3 _  h) U7 d1 T7 |. r5 y# i
            // fill in data
; |5 j' u! n( `  F            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( F  e  y1 F# \1 X8 U. e
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 A4 n" V  g6 T$ u        }% \3 x  F6 [  X& b) [
    }
8 B1 q3 v- R2 _" h4 L, e    else{2 Z7 V; t5 O( ?* q
        if (upp_dmai_int_cut > 0){# c0 b& w' z0 X! ~
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);( u0 a( F6 l) C% d8 Y
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);9 I- X6 e: @2 U( _4 t1 n! G, T; p3 L
+ r0 S! J( E' e' q, A
& ]2 n. ~1 |9 u8 u) J7 g4 i7 Q
            //copy data to upp_recv_list_busy
' x' n% X. Y9 v! u9 E            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! x# ]8 n! q3 D8 r* w' E6 _7 P* ~% _5 a9 D8 p
            //
: @- t4 h4 L  _. H% x+ x            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( D# r) Q1 T9 y! r4 s
1 b8 c; y, a0 i            //  I4 X9 D' H6 e1 z9 j/ S7 S, Q
            server->upp_channel_a_recv = false;//
8 M- [% t8 ^& U2 h8 k' j$ A* R1 I: ?9 f) E
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 n  j: Q( Q+ s" q
        }$ L6 D& L8 _4 Y! W- B% z' g9 l1 Q) ?
    }
- e8 \2 o; d3 p- w% c# r& e
  \! Q9 d0 e2 y4 j' s1 Z! H' k! Q* t1 u6 k) |; I6 m/ c9 b9 m, h. I4 M  i
    return true;5 I, }) v2 f- H1 m8 _' N+ m
}6 q% ]# d# j/ C% M% ~7 A
/ A0 I8 A6 ]' Y* X/ j3 e
static bool server_upp_data_send(Server *server)1 u3 _' E- r6 n3 i8 K
{
( q# z. D1 i# O" {, R+ Z    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ V! Q* Z+ N5 M
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ h) z# x2 S* k
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* P4 Z/ h  ?+ U7 Q2 {        char tmp[128] ={0};
8 |# x' o: _2 N% \/ u. R
, C3 X2 l7 m# A9 x        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 U) `& _' c3 u- ?% h6 D2 Z5 C* R/ M
        print_log(server, data, 64);9 y- {5 a8 H1 X" _
' B8 D. M; Q" }6 F) g, k; n2 E
        //! W7 ^5 X2 i0 T5 C
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);: v% z9 Z5 c8 `- p% [: {. k* }  _
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! n8 D9 o1 u7 Q' E7 X
        print_log(server, upp_buffer_b, 64);
( n( @0 J( E# o( x8 Y3 |; X, B3 T% k: W* k0 p1 P" R2 n
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
, C# o5 g5 w) y7 S; n8 s+ d        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
* e" Y! [5 [" R        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;/ F" I7 j) g& }3 M! Q9 J
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, s, R2 T2 n! q2 g" U+ i! e# F
. q' `% _' m2 y3 m/ f: ]
        memset(tmp, 0, sizeof(tmp));
8 Y; C1 y( v- B) ?0 z! d3 ?3 u6 ^8 Y        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& F# F# d! B1 ^) k. \$ l  ~            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* M0 Z5 z3 ~8 N$ C* A6 z. B
        server_msg_send(server, APP_CMD_LOG, tmp);  l$ u% A2 |' Y

7 j! ?+ x' w8 O$ o- F2 n        upp_error_count = 0;
  Y2 u! r  d! z% E        upp_dmaq_int_cut = 0;0 M3 j. y) c+ d' g' J' d
        // fill in data # C5 z" r- L( L9 m
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
4 W4 C& m1 G: s        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. p" B( h& I( s& Z+ r, _5 `
+ s* R$ F5 P( k
        // wait send success
; i3 j* g9 _$ `; b8 y& ?9 ^* o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( I) R( ], q: t( |

& `+ M- d: O# X$ h        // make data node in free list 8 C8 i  H+ J5 C2 ^3 ?  q2 B
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, Q7 C, k% j. b3 _1 Q  Q/ s        server_msg_send(server, APP_CMD_LOG, "upp send: success");- D/ e( P9 T, S8 _( s" p6 X; j
    }/ H& J9 R$ Z# l
    return true;1 s1 k+ B& f. |1 D0 G
}
6 o3 i, O, j' y& l) @
% o1 D  j& j+ V% k
: S1 i" I# F. N2 b/ q
+ Y- n4 O6 I( p& O* v

' h, R! H9 ?( G3 t% T+ ~6 r; F" Q, K) {$ Z/ o& u, Q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
* j. \0 D8 ^* p: K$ z
, V9 C2 C' b  D# A. w

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 15:00 , Processed in 0.041455 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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