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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 q0 y2 T$ Z8 B" ^5 P* V7 a- n9 l7 t! J% X0 H* k
问题描述:
- [- S/ ~& x; H$ z# L在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 r6 k. [: z' A, s; V
. k# _# J. Z# _. M2 _' O- U图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 J: R# M+ g3 G+ O6 N4 m& Q8 S' V  q# {" F* e: a$ G0 V' f' \/ v
测试结果如下:9 h- b) n: Q# ?  y* h% J
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- h3 k, f8 t; Q
' s6 J8 ]- [8 U1 i! }: B
# I% p- M# n% y# @备注:7 Y2 S0 j4 w* T: _1 G
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' w. G* e# g$ f4 V; Q5 f; U
2、相关代码如下:* B2 R9 `  P( O: }1 S9 V% _
//UPP DMA缓冲大小512字节6 K3 f9 }5 o( W+ W& |( j+ L0 g
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
5 j# E6 D& d8 l! Z& o#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 x( t. E% _3 l3 E; l/ I: s#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); @: ]; P7 ]) O& e3 ^6 t6 Y
! E7 p" l  s4 _6 }- v" z0 p. ?" r

) \3 }" ^; t7 I) v//upp接收、发送buffer
5 m; V! _. }1 N# O#pragma DATA_ALIGN(upp_buffer_a, 8)
  J2 o9 ?+ \- e8 T* F#pragma DATA_ALIGN(upp_buffer_b, 8); h+ T# N+ p3 |% k4 G# x: |0 _

0 R+ r2 v' _8 E; i8 g" H' qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( ^# l- C! }5 C9 X
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 q  c. p1 A0 y8 o# T3 x) m8 y+ C) b# J' W6 p6 j" X! E
5 e" b, S( H% `- v' D# R& q7 A
static bool server_upp_data_recv(Server *server)   j3 o) R( d- [- b, G6 ~3 O# f
{" F# U% E& N: I% g
    if(server->upp_channel_a_recv == false) {6 U1 A3 X- ^1 r, b; N
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' o3 H; P. ?1 G" U        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. |( n. H. W' s
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( M- _3 V* W: y5 ~4 N4 p. T) K: |2 ~. s' [1 U
; g' l4 A$ V" c. N' h0 v. @8 @5 j
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& |. T7 Q, r0 w* T- h* F! o% z2 w; g( C
            server->upp_channel_a_recv = true;//1 a7 C0 P" d7 g
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);7 H! s4 N& R, o
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;: O, @; |% _; ?+ s
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;6 R) N4 r7 R" Z/ W$ Q3 k, G
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
  L- f1 g. u- G( G8 A
8 \6 `% s/ U  H! J2 K            upp_error_count = 0;
) ~2 y3 c& e  Y  Q% z! h2 U# `. G            upp_dmai_int_cut = 0;
% W9 }1 z/ D. R
: J5 g, m% p0 S, A5 @/ U* [            // fill in data ( A( L( f, _+ e6 s+ \, D) \* y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
  r' a8 i) b4 l4 g# L6 S            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- N" o+ C- u, P  l        }
+ s% }7 s# A: B9 K" ~, q' Q    }
) ]* k* }! D" R$ T0 M  g8 |    else{
, T' B8 r) b: l        if (upp_dmai_int_cut > 0){
/ o6 R; \  {" w" Y# t" K, K            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ R+ N7 x3 x4 p) q- |3 t4 e3 g
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# ~- [3 }% q- ^, X) L# \9 \( q' G, G; `$ d* {6 A1 z) ^$ Z

9 b7 A; |" b8 D0 p            //copy data to upp_recv_list_busy
" K5 _$ N: e9 B: f            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* G; O9 H! u8 I3 R1 q+ `: w! E3 s( u* X/ u: N3 I- g. |! J9 f
            //
; [4 W1 Z8 p: ?2 q4 `7 Z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);1 C" p, d5 r2 |
, V) |/ @( G/ o" B5 R+ F  p/ k1 G& }4 Q
            //
* V: X* o. B7 E            server->upp_channel_a_recv = false;//
, g; g% u3 x. R; D* b0 [+ h$ m! r% v4 m; v, M
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 A/ D3 l2 U$ O        }6 e( \! x$ X3 v8 |# m9 g2 ]( L* r
    }$ n4 D$ q- V! s( O  B2 d

7 ~% M: {) K0 D1 [! F6 f4 |0 N$ \% m' c0 ^
    return true;
: I9 f# D& o1 G; P}4 O  `3 \) i  ~( Z

+ F+ F7 m7 g( U3 I8 `( d0 G- N) \static bool server_upp_data_send(Server *server)) e: f- F' D+ C. a4 I$ r5 x
{
- Z" I; a* d+ @4 ?3 P! {3 v    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
( L2 {; }1 i* |6 O        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);. V) I; d4 _3 {
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 }% G1 W% _  K, j& V
        char tmp[128] ={0};6 _6 ^! }. B; ]. |# c' x; i
7 x) J* x, `- q+ q2 j
        server_msg_send(server, APP_CMD_LOG, "upp send: start");' T1 j2 C6 z" N3 Z
        print_log(server, data, 64);
9 m( `! }8 y! U) B
1 W! ]* h' v( j  {0 P8 v- Q        //
" N, q" ~  X5 S# i# r4 J* z6 ]        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 h$ `$ n/ ^% X% I5 t        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
( O2 s2 i* ?$ t- Q$ P+ p8 m5 l        print_log(server, upp_buffer_b, 64);
6 h$ P0 V  L! C, t2 ?: i
7 o; J$ C# e# i        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);% |7 p8 @' i4 j$ r
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
1 \  v+ d& [$ `2 ]8 J0 P. |: _& a* c        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;( m& C( m! |8 u' H+ \
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' e+ v7 Y8 P$ x' \

# o6 @' E; u3 V  n. ?        memset(tmp, 0, sizeof(tmp));
7 {' l$ D" D! x: B        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( w) l; L. F5 h- z3 ^4 A( F            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ F# H1 e$ K8 J. {        server_msg_send(server, APP_CMD_LOG, tmp);5 V6 A" Q& D& i- l

. |+ ]1 l/ p  k4 R, W7 o        upp_error_count = 0;7 H" m& q! z2 |8 \/ X3 U2 T
        upp_dmaq_int_cut = 0;
' Y2 U6 ]% [9 a        // fill in data
- S) J+ \; Q/ B6 Q. N/ y8 h        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); - Y: n8 E3 P3 \- F' K
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ z+ [2 e* P: j6 A# T2 c( z5 ~! Y3 \# N9 ~8 O
        // wait send success
$ T, J3 ~5 M: S% T5 S: S        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   h0 [7 ?, ^. o% ~! i. U
2 y# f+ \. u2 e4 L  K
        // make data node in free list
. @$ U) U% M# H5 a# G        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: @  R* X, N3 b6 E: b
        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 L0 W- e; q  ^7 h* o
    }: o7 n# ?, }; ]' C. ]6 \
    return true;
& x. d5 B% ~: x% [. _}2 [4 @5 ?3 c) i/ f$ h6 B

  B0 b  b; p0 W5 @' F$ W- k, e

3 m8 T, y1 `6 x4 R
0 ]6 n% k% N& J
9 a5 Z3 h* D% H' \, x

0 ?; i& n% Q( ?5 U1 U2 s

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 m/ y9 H1 T9 v% x7 F8 I) U; @* l5 \' C& A* F* }- X

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-25 05:02 , Processed in 0.050398 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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