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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) r! G1 {" ?. U) Y6 `2 G; U$ f

7 s* V& o" H" V9 c6 i( q& p问题描述:; }$ i* {# k' o, Y: W
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. w" \& b$ a5 z" o$ D

% c9 `  d5 C( r/ Q9 v# n+ g' Z0 k" f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. L% C& c1 j# y' d9 G9 S
( G& _) }; g  p% |* V& L测试结果如下:
7 z- G/ j3 k# B( |138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( }7 M# S- T1 S% a% u' L

3 @) g) k7 x1 G( `4 `4 x
9 `+ M: t; K+ u+ m! W  a  W备注:2 T& p5 v" `) V& f% [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?0 `/ Z% I8 S, S3 }1 x# J, l) Q
2、相关代码如下:) ]) T9 x; C; c# ^3 `9 {" j8 D& i: M; a
//UPP DMA缓冲大小512字节
7 Z2 W9 h" ]+ B- H#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ `* Z2 V0 Z. ?# \( j8 ~#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT5 \0 B) m( C. {
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- |( t, m! J. M# n7 I. T, G' U% N% \; N0 y( k  N

$ W, i2 K3 W1 p6 E6 y( G//upp接收、发送buffer
1 U. h, e1 B; G9 i1 c. b#pragma DATA_ALIGN(upp_buffer_a, 8)& W, ]3 Y5 d+ w4 ]+ ~/ b! Q
#pragma DATA_ALIGN(upp_buffer_b, 8)
9 m& u+ S( i6 {$ B5 X
' C, r5 _% R; _) |8 D7 ^unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' d9 p  J! M3 a) t4 K7 j9 `$ {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" l" |4 {5 Q" W* u  t! t
  V2 A2 w, L& H; d- z

4 X7 E! ~: s4 g  L0 h3 x* Istatic bool server_upp_data_recv(Server *server) " d' |0 R+ i4 b1 R/ f" _! K
{
  W7 V3 m0 {( q) v) e& P$ |: q4 i    if(server->upp_channel_a_recv == false) {
9 C& J; A9 P) a$ Y. X- q        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 ~3 _, A6 t: a2 n$ ^" [3 @! X        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 b8 c" Q0 E' k' \, j+ q. ?9 q
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 H  M! n7 Q+ x5 m5 G  }' |7 [" r) `- a3 y3 {" q) A

0 C% [& x/ [6 G% F# `& O3 E            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* i" W/ C1 X5 t+ F. U; e5 d
, I- D' \1 P  M' O4 W0 h+ W3 u
            server->upp_channel_a_recv = true;//- d# Q2 r- N) Y( e7 \$ V9 [
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);7 e9 I" }9 i% g2 Z% H/ Q% p+ k
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
+ {. L% x3 \3 B) k7 X& i            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! j; A/ ~8 s  o            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 C9 Z" J! k" |: [* X5 \6 h" J
  v6 S% J- ~: y9 l) Z4 @            upp_error_count = 0;
& {0 d! N6 F. r" J8 T2 }- @            upp_dmai_int_cut = 0;. |8 |/ Y0 @* C+ H- k) l

' Q, V/ K$ A' a5 k3 Z            // fill in data 6 P! R. E1 n* |9 ]
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, e  V7 N. j# o. f! Y6 c
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! F" u8 H) F- v- F8 e7 f        }  O" y: w. Y* p, T) ?  G7 ~* Y
    }! o' n8 V' E' k# U7 P
    else{
6 }8 h' L( d$ {$ l0 r" L        if (upp_dmai_int_cut > 0){$ L2 x3 `$ g8 d' b
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" A9 i$ i7 w/ N. v
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
0 y9 \/ @% n, y0 Z2 L6 z* e" C$ |  }! t. v

& q2 B' v" e3 U% c" H            //copy data to upp_recv_list_busy7 ]* c) C% p( z: i
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" b5 e" k3 E* Z( s/ p

( `7 Q6 j6 M* I8 t$ P3 s# p( x* [            //
9 y$ H7 U: B7 V. S* x            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* j8 M" }& ?+ P2 a1 f4 g8 y# m; U' Q- }! u; W! L% J
            //
" f  ?) U& P" M0 O            server->upp_channel_a_recv = false;//
8 `: D% u$ ~8 z8 u' L# U( u: N% ^+ X9 h' l7 e, U4 ?  n) v8 P! x
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 B" ^4 u; T4 I6 P( |        }: k4 @) }" f, p
    }2 K+ O* o* M" z5 |' a# x2 g$ s2 `

2 v8 m5 r( l8 i! W' P0 O' ~4 D- f) k4 B
    return true;2 ?, n$ v. ]7 Z
}. U1 J  G5 r+ y5 j2 n! \
. F) b, l2 s& U, H" \7 l; {2 R( U
static bool server_upp_data_send(Server *server)
# x$ Y% i. Z5 ?; C2 e2 |{  \' h. J( g; i" Y+ ^) I
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){9 I, G' ^! K9 J  j# m- h0 n" [
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 Q4 h9 `4 i, n0 I; W- U
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( X5 `' o4 s9 \) X6 D$ N
        char tmp[128] ={0};0 ]; H  ~; e4 h# e$ B1 C

% G+ p/ c) k- D! J1 w        server_msg_send(server, APP_CMD_LOG, "upp send: start");% ^% J# ]% P9 ^8 ^2 G
        print_log(server, data, 64);& x+ D: e, A+ l% v, ^$ E
4 l* v" o) s+ g! f* r4 i1 n
        //6 f& V6 j1 X: r3 H7 Q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
$ ]' Z/ `& N  z4 Z' k8 M: l        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( e% q: v/ Z8 X
        print_log(server, upp_buffer_b, 64);
- `# J" f# t1 t, z* h. c5 A
' j  h6 k# @% V7 ^) }& \- f) E        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
: w5 R2 V; K* Z' l* c! R! }4 j        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 _- M3 G4 z; {: }8 i        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
* |! E) E: d& |3 O, y2 I6 `        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;5 ?% [1 |3 Q. t( t) S) p9 P5 {

9 R: v* X" I0 A) t# W5 `4 Y4 u2 h7 _        memset(tmp, 0, sizeof(tmp));
. }* d0 |/ D) Z' B3 `, x; w+ N        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' k7 ~7 g' t3 k, n$ D
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ U2 x* c, Z' T: F' m        server_msg_send(server, APP_CMD_LOG, tmp);2 V5 W% j& o/ c" K

9 [4 j3 d3 M# E% _        upp_error_count = 0;
: Y/ b3 _3 u. |7 _1 e        upp_dmaq_int_cut = 0;
- o) t" \! t/ \. n$ ~* N" d. n        // fill in data 3 D. O& v% p) I$ \
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) g7 q1 p  W0 _& |' o- l+ L        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. N: o8 P1 Y, @) Y. R
% S6 X8 e6 _% Y8 `/ N& W        // wait send success
# @- X9 k# e( t        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * r1 f( z+ o  K5 M5 k
3 x. a: [) J9 @3 b' U7 S
        // make data node in free list
  h- q6 _9 Z4 Y, Z; z: w: y- y5 s, `        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ C  s5 \/ C! _1 Y- A
        server_msg_send(server, APP_CMD_LOG, "upp send: success");2 X9 f9 S$ I5 j3 m+ X" g
    }
- U: O, \; b# M: i  I: V) \7 U" m    return true;
+ m0 Y# O6 g2 Y& D. o* o! X7 \}
. E, ~2 Y1 U/ b: r! z% F1 [, U. b
) ]+ y# A% b' \8 l4 k) ^
" p, a: j9 B. C  z# d( B* W
* [. l6 h4 A8 }! d( U; {& D. Q

- F* F4 m/ P' |. I7 f2 P
! d7 o' M, p) a8 ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
* G' T& b) ?; S: u1 I" `
. g1 a* A  ~" B2 Y% D9 N. {+ h9 b

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 07:40 , Processed in 0.060790 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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