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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - Y: w+ P) c3 P

: J: r7 T* B& q  m2 u问题描述:
0 g1 ]9 o7 q1 q, t2 C0 C9 w/ E/ X在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. P7 D+ Z" G  G  W8 s& {4 c; u4 p# j" C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
) F; W- S; w0 G) K8 R/ y- t9 B! B& {9 Q5 E' }2 c& X! b
测试结果如下:' k3 c6 \* C  d9 [2 z" ~
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
9 A' T& s+ E& e$ D5 E9 N: w' i: r
+ q! F: R1 ~) u3 x' e7 p1 [
6 X3 g  d) [7 q, I备注:6 r0 n5 E: t! s$ h( y4 w% X
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' f& W& g1 g+ q0 T0 a, T
2、相关代码如下:
+ [9 l( n; ]# A+ ?# Z" a//UPP DMA缓冲大小512字节
4 S5 z  c7 w. x- o! ]  w#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; H& B6 j. s- {+ B+ R9 a#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 M; k! P: B/ v  m2 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. Z! y, p/ _+ o, w
. i' t& J, U7 z9 _* w% D: ?' b. R$ G3 c4 u
//upp接收、发送buffer
& A7 f% R0 k, M2 O% D" S#pragma DATA_ALIGN(upp_buffer_a, 8)
6 n/ u0 r3 y9 `7 n9 N% V#pragma DATA_ALIGN(upp_buffer_b, 8)
9 {0 t, W3 R2 M% K* C8 T3 o
3 f# ?, \) \$ s  m5 Xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 D% c* U! i) z& s, a* T. s9 e9 Eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 j  ~& m7 Z) A/ m( @4 g5 \

: I9 i- @& ]* k
5 u. e- `) Z1 o% `! O2 V1 O2 ~' }static bool server_upp_data_recv(Server *server)
  ?. n  Z' L9 i& ^{
" h4 M! Y" b& K4 W$ _' I$ h    if(server->upp_channel_a_recv == false) {" t8 D& c; ^7 `1 i/ D  g" C3 Y
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 N# u4 U; o4 u: b, i
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 [8 r3 G$ F0 J) R+ U% O
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; Z& D/ t5 y, M: m8 E+ K( w
* W: r0 W( A3 m' _& L8 @$ Q
' R* z- I  I- t6 b* D7 u
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 o( E5 K0 t" w# s& C& E9 ?
9 Q' _2 ?9 e3 A# ^            server->upp_channel_a_recv = true;//; T# Z) p' b) i; v6 L5 F
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);5 I% [* i/ }+ X7 G3 A
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
. [, H6 @' C5 Q/ s( v            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;- i' ^7 [" m; w! R" R9 ~3 S+ m
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 w7 X' Y. A3 G0 l

3 v6 V+ l8 R; t) d% b- ^! X            upp_error_count = 0;# x/ t1 _! l; p2 ^
            upp_dmai_int_cut = 0;, W, A* e) D% b9 |( p0 f4 X/ W

1 Q+ ?; }% l( U( a& p2 i* S8 p& g            // fill in data
# `" n& f- N  m( N            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: z& P! \$ ]! a: g' Y            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 w+ v. o0 v% }" A( {        }9 Q% J8 h9 o$ P5 V" U1 u- V
    }# @7 m' S! x/ m3 `* D, h
    else{% {+ _& V9 f; v, X3 q8 l# B
        if (upp_dmai_int_cut > 0){
* o! n! \* B+ G2 d  w! J( \+ g            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ t9 Q% D5 o; g# [5 o/ r            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: C' Z  I/ D( D4 A" x  w0 V, G3 B4 W; j1 R. [/ K* Q8 m
: L- Z! M) R7 s0 w5 B, w7 u3 p
            //copy data to upp_recv_list_busy
3 X2 S  w' t2 F3 n            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);1 F- y4 T' ?* Q1 C$ ]; U: F

% m1 g' w8 X8 ^! ^4 s/ T            //
' r+ |3 e* y) a( i4 a            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& O; x# j5 u0 R0 m4 O$ |

. k1 v; p& r8 z/ W! G9 q4 v            //
6 E! ]. N# L3 t+ P: R. S            server->upp_channel_a_recv = false;//1 g! i1 m6 [7 Y9 q
# Z( |/ A# S, O
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");, Y- @( x/ v5 t) a' u
        }: U( b3 J/ P/ V% K
    }
: H9 Q% x+ e! P; O( A2 P  ^% P) S+ X. ~; m& B
9 ~9 u1 E* O: e, X! z! g! Y5 T
    return true;6 l2 a" p! ?; I$ W
}
: q6 k# l- `+ c7 D4 P
  o, U/ R& U" z" P7 m6 H4 Gstatic bool server_upp_data_send(Server *server)7 F1 y0 h0 o7 T  a/ W
{
, S) O0 m1 ?8 e/ {* O$ n9 }5 z/ A# u    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: U6 O, d( ]; P( k, z        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 m2 b7 I& o! R+ `2 b2 ]/ H        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
9 B8 k# i: v5 J/ D) L        char tmp[128] ={0};6 ~3 x- ]9 u! b( l; A
) Y9 j5 e6 _( E6 r3 H- j
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" W- ]0 \" H& S" X9 g        print_log(server, data, 64);
& m4 p% k! x: J8 Q; G5 D" b
0 O5 h& R/ J; x        //3 ~: O: w) B) D9 D
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);0 h0 E0 v; Q5 o/ p. Z# \
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 D0 G+ m5 i0 v  y! H        print_log(server, upp_buffer_b, 64);
' Y) L5 M' t4 A$ R* u( }4 N" r$ H# h% M5 P
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);7 G4 S! J: F% l; T2 v8 y' o. ?5 ^( d
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 2 D2 r) J; \0 R7 I6 G, F5 {
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;/ V7 S$ Z' ]) t# w" j8 o
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 l" f& H" Z4 p: ?( T, Z3 d. y
) |9 c/ Q! w- i9 d( S+ x. `  z
        memset(tmp, 0, sizeof(tmp));; i* {( d1 ~$ H3 Y3 n/ D
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . a5 f8 u2 ~+ j- N1 S. N
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
. l5 H" J. V4 f7 `        server_msg_send(server, APP_CMD_LOG, tmp);
7 c1 C4 B) ~5 ~# F, B+ ]! G! P: V4 [
5 `) H. }$ A+ l        upp_error_count = 0;5 z4 Z: |% X2 A
        upp_dmaq_int_cut = 0;2 a( ^7 T  p! J. o
        // fill in data ( S! \' q7 @/ i. {
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 c" J/ }6 L# K4 N) R2 i5 m) X$ z& {        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 h4 p: f0 n! {( A7 L; N8 U- ^
' O* ?* h. l, q: y. V
        // wait send success
- x1 r9 y. w3 I" S5 M& s        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , }9 N( \" R0 }
/ s7 m. j: J8 _5 S% d0 P7 G% @# i
        // make data node in free list
9 U0 l  R! H+ R1 Z0 B( y        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, z9 q4 O/ y" W+ i1 ?" K! B/ c* X        server_msg_send(server, APP_CMD_LOG, "upp send: success");5 K$ H, y! S# y
    }
" v1 |: q1 m+ C. G. d' A5 e    return true;
; b& F) h6 n7 B9 `; n}
3 F/ E! C! J7 v7 q! O" n; u' f# Y( X* x, f, w

: `' N  L8 i& q" n. U$ P# z
4 Z: U  L- y" ]/ f, T1 t
# A7 `( B" q% m" M: O* \; s

* a5 S7 q2 O! L6 I" P/ l

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
" u2 B( E/ K* X- `  w* \% [0 Z2 J3 Q9 r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-13 05:38 , Processed in 0.040598 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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