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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' \. ]9 ?% q: ?' h, A! \) g/ p( L: J
问题描述:, P2 t; r5 R& V# A( c! U
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
! H& w0 R% o. I6 b! a9 G* L" c: J, u
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: a/ G8 J9 @4 k! [2 ?- v# ^1 Z" R# }
测试结果如下:
$ ], S7 |3 n+ c" R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 d0 z, u2 |& R9 X" i6 h: X* c) |# b6 _9 n  ~! v/ C9 G0 @0 [! s( ?2 }
9 D0 \$ w/ F& Q+ G" U* \4 ~7 u
备注:. K" e( c6 d. s  g! H8 m3 _
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ N/ S7 _& I" R6 [  V
2、相关代码如下:
7 j) m) i9 e+ s& E  i6 }  C0 J//UPP DMA缓冲大小512字节& L) Y1 t$ u3 R* X5 L0 ]
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
  ~! L8 F1 c7 A7 t1 L# Y#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 R% s- }* a# ?" C# A8 \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)+ }5 @/ Z6 {3 L3 ?" x5 h
1 q, f, f" z8 b1 E6 s

/ |, u2 a$ S0 P- ~3 E//upp接收、发送buffer
; `1 A- _# @: A4 N: x#pragma DATA_ALIGN(upp_buffer_a, 8)
4 Q% O3 p8 n6 z. q( l2 y8 u#pragma DATA_ALIGN(upp_buffer_b, 8)
" V# k. a; o, y# ^+ U0 |+ V- U) D; L% k: k. e" w+ {2 @
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 a; A3 d- e' V1 B: G6 q7 H& T
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
* K4 ^' p3 }/ A3 W- @8 g5 P, @0 a  N2 `" k
8 Z% I! x6 w5 S2 Z) f
static bool server_upp_data_recv(Server *server) + `. r: }$ c6 @. e# v( F. a
{
+ ~" q2 [5 K+ q: [    if(server->upp_channel_a_recv == false) {
# T* ~6 ]5 [: n$ ^/ R+ T$ a        server_msg_send(server, APP_CMD_LOG, "upp recv: start");. [9 S# N, I1 U: x) C1 H
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) B8 t6 C# q- J* s- S  \
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 k" B8 g0 a: {6 j# o3 Y5 M5 X, r+ c& A  L
1 f. q0 N1 U, J$ I9 u
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 C- Z0 ~9 r0 U' V) G0 q. m$ T2 e4 {' M& w4 p( z" T
            server->upp_channel_a_recv = true;//
% s  V) Z5 h- P2 r# w            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# K+ v) _- [, t2 k+ _% R% f7 o            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;: c2 e9 `8 F& h& ^% @- {' p2 Q# q# i2 E
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' |: z1 v  ]* B/ k) H
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 x; S6 m  j' N8 z

  t' w2 z( Y' d: l- n; b; `            upp_error_count = 0;
4 e, I4 C+ h9 Q& p            upp_dmai_int_cut = 0;! l4 ^; y" x3 S& M  ]

3 o+ W5 ~' O2 K$ k$ g            // fill in data
5 F. L  X6 Z/ V5 W" N' e; v            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 @3 ~: Y9 {4 i2 Z! R6 i6 Q4 v
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 F" c) g5 X! Y1 J
        }. d- @2 e# a, O  h, ~# [% b( H0 H
    }
0 N! ]4 Z& C$ K0 U2 e' o* j    else{% Q- @) `! s. P/ }% C
        if (upp_dmai_int_cut > 0){+ {0 n+ K& Q0 R, i/ O0 ~
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);2 H) z, B9 V( Q! M4 R  {$ t8 {: j
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 c8 Y: i$ i' u1 A& M, S7 j

8 T6 h1 Z- a* `! n- _1 r6 G/ v
& I" N9 X7 g, \2 G- D9 b3 {            //copy data to upp_recv_list_busy  C6 c) z# p8 @% S' l3 h
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( ?1 o9 K& O- _5 [/ @! [- B+ }3 X
1 c9 G. _& r; G, s" `            //8 c# Q1 I  r) a4 z1 n
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 h+ |) b$ W6 l
2 f3 N/ Z* J/ q9 {
            //$ X0 U  H% y, E/ L
            server->upp_channel_a_recv = false;//
" U+ M  `) l; r" E9 H& t( R7 }' j1 v! {9 \, b  D" [" l* s
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ U& E. x8 q( @# }. E* f        }) Q' M! b# T8 c. S+ P. k0 G/ \
    }
2 K+ B2 T6 h/ T; c& X  A5 S$ q' \5 g$ K) I8 z# N+ S
: n/ B) _/ _* n5 x
    return true;
; I7 H9 Z& {2 }+ b4 @}
4 N  M+ ?/ b) M7 L: [3 g9 W9 O& Z1 r8 i) f- M! i/ \! ?% W* w
static bool server_upp_data_send(Server *server)- X% }2 a/ J4 V2 X
{: S7 Q. E( l$ m, k* ?' U2 P
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ d: Z$ k/ v1 M/ t. j, L$ t        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% A: z0 f  _1 d( L, J$ C        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* [( |9 ?/ _5 ?3 t
        char tmp[128] ={0};( D% V3 ]; O" f6 l/ h3 s
; Z" F* h4 `0 @. H- x) g
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
: o/ @( N, [, Y1 T        print_log(server, data, 64);
: {& U. |! n& D/ a% ]9 B5 o8 J7 q9 k) ^1 X. s% u
        //% ^8 e4 [% ]9 j) ?0 `9 e$ w- n. E
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
2 G3 X2 ^: V2 [* W( k        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
  B  J5 q; q8 J4 `        print_log(server, upp_buffer_b, 64);, X: R3 \' X, z3 D4 L. F
+ P/ Y& |( l' t* ?4 x
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" r+ ^% \, u4 N$ r+ e        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 s: e0 F! ^& y3 h5 x( r1 ~        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 w" g( f) B/ @6 s( ?8 H        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ x9 {" s- ?+ ^" r0 X5 v, M$ P5 e, B1 j& X! l
        memset(tmp, 0, sizeof(tmp));
& r9 Z* W1 Z$ c( W* N) z( H        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " W) B& p6 \8 ?. T2 n0 p
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ ?; U8 `0 s/ {' P  M$ C
        server_msg_send(server, APP_CMD_LOG, tmp);
$ x* k1 }, Q/ v: ]- v+ ^( y
, J: p+ X* h  q  S2 F        upp_error_count = 0;. o; t$ W" Y" W2 S7 w1 }
        upp_dmaq_int_cut = 0;
2 ^! k+ t* g- d8 ^: C( {        // fill in data ' v$ N+ @; E2 ~# A$ g: {! g
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , N% T. I* n; d. b6 t
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");! O& g' L, ~4 G) `8 l

' r! s  R; j) s9 B) ^% A  H' _! @        // wait send success
: R5 t0 ^6 D" V/ B        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 d6 F' u! O4 T4 i! ^4 p* k# A! ~- [- _; r+ T! i
        // make data node in free list
8 r% a" X/ d9 m2 G' ?        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
6 V+ b3 s' q: @6 z! y5 l        server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 H6 I. m! C; I. q    }3 W" U! L9 W) Z& U* ^6 t2 ~
    return true;
2 W4 x1 W5 H5 ~4 i8 |4 p}
5 Q0 g# c' j- h0 d6 ?$ `
4 Y; |; r4 U* r
$ q4 t  H: m9 G" U2 [0 a& k

  v3 U! t; Q5 }. Q5 {
) G  X6 N" l( J$ T/ z. V% u
: {5 c# }; l4 l0 l/ w# }8 D

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
. R. R2 y+ z: q$ o' g( _5 u# h8 r+ s$ I2 O6 R" U

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-21 01:09 , Processed in 0.040584 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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