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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # l2 m% N( k6 Q/ P

# V( C! y1 X3 N/ f. O4 o问题描述:, h& M) }$ Y; s; j9 \7 z
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
) j9 y. ~; i# P7 m; A. `' r0 F$ y0 C, |' W1 P2 d* h
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" M* L6 D9 e% c) n& d1 ~( e* c& m6 M. x# b3 u6 k4 ~
测试结果如下:  E/ m; l. J# i4 P( X
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 `4 p8 u( }  T' q% u0 K# p' n: f9 |1 l. K5 y+ ?' M

, C9 C$ I# o& M备注:3 ?0 d" T3 L7 Y$ i
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# Y* A, J0 x4 p% ]" z; q( l( O* l
2、相关代码如下:4 O' Q1 Q8 w0 o% |: c& T9 n
//UPP DMA缓冲大小512字节
- F  d3 U) w1 p  r4 T! I. k#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ F5 d- g# v( C) u#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ x: `; l. l' a. v#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& p2 ?7 T" n# A
. `& F( U: Y) j7 I6 _1 ^: l7 H% c. L
//upp接收、发送buffer1 h, r/ j: q% m1 _* ^: J
#pragma DATA_ALIGN(upp_buffer_a, 8)7 p' H7 ~% p2 M$ v0 {& ~
#pragma DATA_ALIGN(upp_buffer_b, 8)* d9 w2 V, i4 K) u" V, S

5 h/ p+ t6 s$ t$ o0 b: j& Nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
  y# @! ^8 I2 yunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ h3 J/ z+ `$ b3 ]5 j* ]

; ]% P9 N  P; I% q8 a
/ i4 z' p7 g+ S, J. n7 L; z& ~static bool server_upp_data_recv(Server *server) , z% _  `( S0 B& P; w: f
{% F4 h% q* |: O; z. y
    if(server->upp_channel_a_recv == false) {
- F" q: h( j, W, v, A        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 k# v0 C( O* h) o- p0 t5 F, U        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ D5 z+ B' B7 E! u( I& y            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ M& r: ?1 A) q; ]/ N5 g

/ d, i: F! S* Q) Y- {4 [/ K( M4 r7 Z+ `" N
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: n) e0 E$ \- ~8 c

' F8 [' X& j, n# c1 n+ O            server->upp_channel_a_recv = true;//* x5 b& Y3 r! A3 T3 _  l0 e6 x9 Y
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);2 H% w1 R8 ~' P+ u3 P; c+ f
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
* s4 H$ i0 v0 R9 J# R# i  \            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ ^0 T. z3 k6 g2 u4 o+ h2 ~* c            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
5 ]2 F$ q- Z5 d- |
$ Z2 ^5 a  y1 v            upp_error_count = 0;, E5 ?2 O+ W" i; o
            upp_dmai_int_cut = 0;
" |, P3 [" ]# h/ Q9 t
4 ~& f1 q! Q6 Y+ j            // fill in data
* f: c5 ?" G7 x( a1 l) J7 w& l% K            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 x' U3 b) {! M8 ^            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! `& V$ s* W3 D# z9 L& @        }( ~$ U  e' J& p$ s
    }
, R) |/ u, P$ t# o    else{% w$ ^3 @$ }) U" k1 ^
        if (upp_dmai_int_cut > 0){
: V/ @  m. v9 M" m2 a            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);7 c, k' h) C) X3 x( H) D9 }
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" ?& I" g7 H8 K/ A/ V# ^
. |* [: t# j. [
0 S3 l! R; i. [            //copy data to upp_recv_list_busy8 r3 W' |7 d3 v8 d) [
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: ], Y1 I% B" Q8 K& L1 `7 q, h* |9 U7 G! Q1 }
            //
+ U7 F3 K* ]# a1 N* e( U* F            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ y: `, G: L) k1 f) t7 N' z/ f+ z8 z1 \
            //: c9 `* }, Y& z9 [( p
            server->upp_channel_a_recv = false;//! X( F' x& T( R

% R' d3 V. R  ]- N            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) l; I; m3 d5 I7 @6 g8 R9 c        }
0 z6 P0 M* X# P3 A- P& o    }
% w. R; I# v7 n1 r
6 s9 P% ]' q1 @% B1 J# k4 y$ X
6 Q/ L" F6 h- A+ {) E& X8 f3 Y  c    return true;& T3 J- m: @4 M5 z( n$ A: J- P, ?/ A
}3 T8 ?  m# C6 q: D, c) h8 W8 H
! d% U' g  z8 V6 t
static bool server_upp_data_send(Server *server)
0 S3 i5 k; E% ?/ Y3 ]{0 n1 X' p3 o" p" v
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
1 f! s$ z% b- J; x# _        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 [2 B" S; D/ {        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ g; Z$ G2 s2 i4 f/ D; P
        char tmp[128] ={0};
# ]9 E# G5 ?# x8 [* \8 v7 }. a( H# ]( F! g
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 t# D% l& {! Y5 I3 D# X. e! U8 f        print_log(server, data, 64);! {; `0 I& d6 k% ^

8 C' P# K: v. y; X. C- t! H3 b0 j        //4 l7 a" H* Z+ C. _! k
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# g; i; ?" k$ ~/ ?9 D+ F: E        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 a; J9 V4 s; o0 K' r, V1 m# b8 a        print_log(server, upp_buffer_b, 64);9 ]/ a& [) `( D1 ^9 ~/ ^( I3 R2 a! k: E

* g* S+ `! y* |  o& g# d: v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; ?# T. p+ [, u, r
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
. G8 h3 w: p, H        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;# v+ r2 {$ c7 i
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' ^- i: |8 _3 a9 O
8 L% A* K$ c( W6 [! j  I
        memset(tmp, 0, sizeof(tmp));
4 ^# u) N& e) v7 m, b' n        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 T3 C1 i+ v5 p' S; @9 y' B
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 l2 |$ {# E! m
        server_msg_send(server, APP_CMD_LOG, tmp);$ T2 H  v, G2 w$ R" y+ i: p( Z. L

, N: E' q2 _8 ^9 T8 [( }6 _' L        upp_error_count = 0;6 D5 {) z1 F4 l2 M' R9 e7 }- C) A
        upp_dmaq_int_cut = 0;: M+ w# b' s! b
        // fill in data " w- U* d0 T+ i* C
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); : [$ A4 j% T7 a
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" I4 Y4 l3 E: e/ C+ b8 s5 I6 Q
% |: ]) S* d! \5 [6 M0 f' P/ l
        // wait send success
8 ]" u* m  Y( I6 a7 f  i        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 V7 P9 }4 C* ]7 N% q0 f; s
$ @7 C; q: f3 @$ Y" ]& ^2 l* D        // make data node in free list
  n# U: T' E( R0 X; Z        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 ]- r* j4 m8 A3 ]
        server_msg_send(server, APP_CMD_LOG, "upp send: success");5 P6 \+ P+ @3 {0 {+ q! Y
    }! Z/ b" |4 g$ s
    return true;3 W$ O6 G6 Q! @' o, }! e
}
4 ~9 j# U$ |% x1 }& h; Z  k* K( L4 i( @
! J+ K9 a( x6 I, M$ ^
7 A8 U' y, p! ]( h- I. g
. ^& ?  {' T. v  r# a8 Y

- @. w8 k0 t& z2 l2 E% |, z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
1 C- e3 I4 k. \6 q7 |4 z1 Q: e" L
* w" _0 ]; F$ {- o* j4 R( b) o) P

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 09:58 , Processed in 0.043184 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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