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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) K" [8 \% M  U; V, J5 M+ u7 j3 Y" d5 C* t1 _, S3 ^
问题描述:
! V' A/ r% h% d在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 k% [4 E; K7 I" r. m) a

9 J  e" W/ |, q8 X4 r% g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 k4 N) z7 E: N- A) Q) Y" c
0 M$ P- g0 P$ i. F8 Q
测试结果如下:3 x; {; o/ S6 ]" k/ \) ~2 S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 s; M8 B) N/ v( z& X+ o  M. X7 T; F/ ^* u$ m' s, i1 x# i
/ B, N) ^5 {% |" p8 p/ z  y
备注:
# x: w! k" D* e1 k! Z4 V5 s! o1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# V; h, @8 O- Z6 C$ i# t9 W9 c, r
2、相关代码如下:
' d8 j* O. ^, t  A- R  J' |//UPP DMA缓冲大小512字节. ]/ ^6 O# ?9 V0 i4 R! d
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍4 D* m' W% n' B* e7 l4 R" R
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ d1 h, R9 S1 k: S/ c: T7 ^5 [9 z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( q4 F. F  X5 X/ _3 |( J7 w
, j% {1 O* J% s, P1 c9 c

7 a0 ~- u# }6 V( u: P4 C4 |* \+ O: ]1 O//upp接收、发送buffer, a6 C* ^& O' J/ b% Q+ U6 D
#pragma DATA_ALIGN(upp_buffer_a, 8)
( H$ G4 S* C' d( v: n' p#pragma DATA_ALIGN(upp_buffer_b, 8)
) Q! ?( F" `. k$ l& |- P1 K0 r3 \& B) P! B1 A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" d' ], E: M: Ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) M5 Y% }1 A& g% B. }

1 |' X" A0 @% {( \, c
- k. C/ ^4 n1 j( m+ a& s( T; ~static bool server_upp_data_recv(Server *server) 4 [5 i1 g) d3 ?7 d1 M
{
9 K! }/ |8 s; }9 A. R2 p# ?& r    if(server->upp_channel_a_recv == false) {
3 K: E0 k; y1 D        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( J9 t$ {# O/ U7 v, o
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 q2 ~  ^( y# |# q8 G  u) {            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# u& x4 W6 U( L: g$ U
9 s( W6 v4 P% U: x% w

- O0 ~5 t; D  h: E& |            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ O3 y1 v$ X# x0 J6 x, [
) r7 @5 K2 h/ g0 ]+ h: ~) X
            server->upp_channel_a_recv = true;//
* D* l* a$ c& r/ U            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);4 X9 M" ~  G! O
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ i- |# J/ {% A8 |; g" C; R9 B7 U            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% D" l9 J& V& |; W9 y0 |9 ~* J
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; g* g+ H* z3 @' r4 d+ B5 F+ Q- u5 D  v. d
            upp_error_count = 0;
( {9 A, `3 Y4 G            upp_dmai_int_cut = 0;
/ h  P- v6 s3 R3 V1 a4 q
6 r4 t$ o: n) n            // fill in data ' }6 J8 H3 ~5 Y* C) v
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
7 Y! e& j0 K5 r9 b' I! [            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");6 X' k& o* M( U; y, r8 n1 |2 G8 d
        }  e- y* s4 h! Q0 I) R  ?3 _
    }8 @& ^4 m+ Z, v) i3 }! y; G( Q# o% o
    else{5 L  \; A) A3 d9 ?( A. R& z! p, Y
        if (upp_dmai_int_cut > 0){
% y: ^/ W. r6 K7 p            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);- Y: f- [+ m: i, K' a7 v
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);  R$ d' D. T7 S$ X

. R% x5 e: ~3 j- h, W& a( Q1 b) r6 F5 D) ?$ g7 [2 P
            //copy data to upp_recv_list_busy$ L! A% v2 e  d5 q0 t# j$ Q
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ e+ F5 z/ V, `6 U5 W1 D4 [: y$ x8 g1 k6 R: o& d
            //
2 ?4 Y9 D/ `5 b9 n: ]            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! u5 i' J+ H; `: O! `7 C
6 K3 O- h0 _* i9 p; f7 @$ Q            //
. c, F. f9 N4 R- \            server->upp_channel_a_recv = false;//
* k2 N: N+ t2 G  f  Q" I! G5 P% x$ x7 g. @0 Z* y
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");! J+ Z& E& p# h$ w* }
        }
, m* W9 q& n9 r: z. h    }$ H$ T+ b, j) @6 t% ?/ W

$ L, u3 a" B% v; V
: k. `( p& O3 W/ {7 ?    return true;1 i2 Q, P9 E) |& g
}% d" M" O+ m" e7 T: ?" G, d, e
- I% H! w8 ~" u3 ?1 D
static bool server_upp_data_send(Server *server); W; n, j0 n6 ?$ M
{
2 }7 D: ~0 u7 {( f: _    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- D. a& k$ a  a+ J/ c7 Z        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
: k! x* K- h5 p! F' M, j. x: _        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
# q' w7 F2 r6 \' r* v        char tmp[128] ={0};
  H; O( Q+ a% W- `+ B6 z" i- G) u( o4 F& W/ ~! B5 k
        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 P, I. Q5 D) h1 B) \) C) g, K
        print_log(server, data, 64);
- J, x) b" x/ r$ O3 ~! k6 g% X9 ~5 f# P" q( T8 R2 @5 O* [. g% Z
        //
/ Q, V! D  K( r5 \8 v: s6 R+ M        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ M1 i' s' F3 H! f5 ~2 r3 q3 W( z
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& W: z0 x% c' f! b3 K% k/ ^0 R        print_log(server, upp_buffer_b, 64);  {; Q( G: u/ L  X! e8 X1 [

4 p; C2 m# `5 _# ?  ^4 I        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 `; R- r# e% _+ l0 \% O        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; - p9 d' d/ @" N3 m  n
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
. N' H" U! }, ~9 H: m0 P        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- i3 }1 f( g3 W8 w6 H& k  _, U. l9 Z& y
        memset(tmp, 0, sizeof(tmp));+ @0 s) W8 J  K7 i# C
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' S9 O% S* c) d            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
, k$ x6 {; P: H1 g/ O" z% X( U        server_msg_send(server, APP_CMD_LOG, tmp);
3 k6 Y7 c& K& B& E! e2 o7 V8 }5 A. a9 E6 u
        upp_error_count = 0;( `4 H6 X& @  [* ]
        upp_dmaq_int_cut = 0;- D$ O6 o" d3 C, a
        // fill in data
4 E- H# c  L& @, [. k2 B) `7 b        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 y$ s) Q, P$ E# M# n" Y) n        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' B9 G0 O' r  Z) k
* R+ ?* `7 [1 i+ b  u# a8 k
        // wait send success1 ], s# b, z- U) C( y3 ]
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 0 |7 P1 T6 }( u4 ?
; j/ t* @( R1 O% E
        // make data node in free list 9 l/ R( d! G0 i3 \
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 a" T- _  L' [& S4 F; P2 M( ]        server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 y! s6 P8 S. R+ z' e( d    }4 u% x- s  P$ P
    return true;3 `, p, o# o8 C, A, C- ]
}" d# `% a8 k' a: t) f6 r
. u# E# x9 u  T9 d

/ U' t8 F$ ^5 O4 c+ b+ \1 ?6 R; b2 b: e. N7 ~' q% ^% ~! p

/ [! O# X% n' ^/ i
& T8 V: p1 q! C# g3 X

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐0 h3 ]/ v/ Z( B% F
- ~! R( i3 B3 z& K3 q5 h5 k, p  M

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 22:29 , Processed in 0.040804 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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