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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " H5 b5 ]2 N% S& ~

1 X8 A0 [/ l8 v6 `  I问题描述:
" d/ Q, C5 l* L! q- g& P1 |在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
7 X& m1 |, m) k% w; }2 p
& m6 f' S; |+ E7 z& [3 A: I2 ^图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 ?  X% s) I- n# x0 H7 z% p. c

; t9 z/ r$ x5 c# T7 C" N, k* D测试结果如下:5 @3 y" M" T( C3 V
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ L  s" h' h! [) K; B$ b

4 x+ S3 D- o# ^. w0 Q4 s
9 N. l% C" \+ c; o备注:
8 {5 z, F7 N) y1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 R- J9 P' d. s5 F
2、相关代码如下:& M+ q% J" i7 f# ]% G" f
//UPP DMA缓冲大小512字节4 p/ P! I+ r0 }: L
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' A7 y8 W8 d1 @& K6 k+ G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
1 u6 C5 s1 `: |1 v, i9 N8 b#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 r# A) H2 T) ~/ s' H: e; }% [. N+ W) w2 N( b! h
0 J  a3 o1 z- Y  |
//upp接收、发送buffer
$ Y$ r& F$ B! r& g/ Y5 S#pragma DATA_ALIGN(upp_buffer_a, 8)
8 C; O: p0 {0 W$ n' [#pragma DATA_ALIGN(upp_buffer_b, 8)
! [9 s: ?3 |: q! a" q- D  O, W) w8 y3 j; e3 o5 |" i3 y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];+ C5 r0 N8 _" r7 ~$ t
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
- h4 a6 I& Z2 q% l
2 I( V( V6 B/ Z+ L, s1 W
2 t) V$ R$ z% r4 V! U* lstatic bool server_upp_data_recv(Server *server)
( ~8 q7 c8 A5 P. I% A+ T0 H{! e9 `, C9 ]' L9 @6 {) x
    if(server->upp_channel_a_recv == false) {
: A! |4 M- R$ z9 ~        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) `3 m- Y7 f/ {+ z8 _        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
/ u& c1 f/ V9 S            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; j# K8 L1 _4 u+ M8 N2 l

8 s, ^" l) W( B8 K8 w; }+ H  A/ f+ s5 B! A
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" m( n$ I2 L5 B- B  Q: H& c+ f/ S  M" M7 V% [/ W
            server->upp_channel_a_recv = true;//
- y8 U, K: v7 A8 q            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( D2 i! m" Z8 `; S3 K
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 g! G6 d& |7 v2 i1 y5 f1 _/ s+ z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
/ v0 |' `' ?  T. k( v9 w            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. x) L) K7 _: W0 F2 L& n6 R7 t0 n: x: d2 ?
            upp_error_count = 0;' B* F# r# ~3 ^$ @; E
            upp_dmai_int_cut = 0;$ g- t# F& M* ^* L: c6 g  W; j; w& c
2 C  w. F3 V9 v* r5 A; O1 o
            // fill in data & L# }+ Y, L7 A: m9 C
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 k9 v5 Z1 ]5 h& w3 \            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
+ l& m$ Y& Z& s: o        }' K; h, L, u# i6 z8 H
    }7 g0 X4 ?8 C: Z( Y/ S1 E5 R
    else{4 m3 `5 X& I" E, k7 M
        if (upp_dmai_int_cut > 0){
5 }, _8 v" W8 j, r8 F. U& }            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 \5 I1 M4 m0 P+ Y7 _
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# K1 u4 J$ I4 G) Q
8 v: y6 w5 g$ x# ]/ U
5 o0 e. R7 U* k' ^            //copy data to upp_recv_list_busy0 t7 L; m) {0 x
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 }3 M- ~7 H! }4 u

) ?7 B3 v  e8 s9 C6 ?" P2 P            //
* G% `1 T. P) O4 V- m            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ O. I" n5 i2 O9 o$ P; }/ S

# k/ G: }0 N1 G% P# s4 d8 K6 T            //9 n/ T9 B; j7 t4 r( O
            server->upp_channel_a_recv = false;//3 j+ }: C" I5 ^0 I! o$ f  c- |
! n* t6 I9 ^3 O5 [/ E% b4 r, o
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 A, T" _: r- z- s
        }2 j* Z6 N# {/ p" h' a6 L
    }- z  c7 B7 [0 d) r3 o
- N  I2 C  E5 L
. R; K! i! m7 |/ `; q
    return true;% X3 W/ C0 M1 m
}
# n) A: |/ O% A0 m  f* z; [5 s
3 d7 w" ~" h* c. z) s4 P3 a" qstatic bool server_upp_data_send(Server *server)1 S* e3 R$ ?2 h1 V# Y
{5 r" P- j' O/ j* H; }8 g
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 m1 M; r- _4 w. h0 x  [, ~/ Q* i4 m        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 ?' R/ }" L. w: z4 m        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
6 A4 M5 X* t' B8 R* W+ I        char tmp[128] ={0};
' `; E7 C) i& p; }# D  y  D" `& }# u; R) P% n( j+ ?# a
        server_msg_send(server, APP_CMD_LOG, "upp send: start");% `$ ^$ P3 ?8 ^: j
        print_log(server, data, 64);3 z2 j& ?9 N+ F# }. |: ]7 Q, H
" }5 A  Q5 z& K: g; ?1 p
        //
' b3 n/ W: W6 X# N" k        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
$ V4 c! e5 }: v/ V: j        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);, y9 K3 _9 h( r( w. o. O
        print_log(server, upp_buffer_b, 64);8 `. e; ~3 R0 @1 n
) F- w% l& w( K/ I
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
  F$ w/ K! s) E8 R: {# `        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 0 k1 Z5 K4 f& F
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 i& L& @# |: M* T
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' Y' ?3 f3 m2 ]2 s! J3 z) ~5 ?' }. a$ ]
, j0 a% S# w+ S* K
        memset(tmp, 0, sizeof(tmp));
/ m0 f. m3 A, B$ F        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( I9 v( M' W; R7 g            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 m! `1 Q: K! H1 H        server_msg_send(server, APP_CMD_LOG, tmp);
- h1 y6 m$ M& d
. ~3 `3 q6 V3 l  H% q. A* b        upp_error_count = 0;
& E% b, h8 i' j9 Y        upp_dmaq_int_cut = 0;! i8 h& k0 k6 B3 c  h' U
        // fill in data " x& o/ O3 F6 a% i. W
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
; B8 e, N6 I( Z$ u, Q  k3 ~, X        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( R1 g0 F1 j* J9 ]) C
+ S' _/ B5 O: {5 w  K$ `. `        // wait send success5 P0 [8 P. j7 Y& N
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
# @3 E- R$ `4 A* i6 x  y. V3 M% L/ ?: D' ]1 k
        // make data node in free list $ r+ o4 T+ F1 {
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
; h4 z% \1 p* e7 y$ Y7 {+ J        server_msg_send(server, APP_CMD_LOG, "upp send: success");
% y& W/ v3 _0 p% l* A* U7 V" q$ @$ S9 e    }! r$ u1 B( R* G, A' x
    return true;
( _) N4 A5 I, R3 J& N}
! l) h$ _3 D3 u9 X, T
7 J' R5 F. @* t5 R7 P( F! @6 z0 a
6 k! U% t+ N/ X

8 }4 z) n% U! p" |2 E- ^
% R" s& v2 U* @1 [" G4 F
- o- S; A& R) }

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐( F5 z; B6 f* @7 K& R# M" Y$ c4 r

5 S8 X& {0 R  \# M! H

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 21:57 , Processed in 0.041748 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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