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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
" z$ _" I7 ^7 S9 o4 d
8 ^/ ?  a1 ]: b问题描述:
: z; k/ n: A) @/ D5 h! D在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 b* G# c% K4 n

" @' F# c5 `" O0 I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 O; r, Z* {; o6 J* k% ~, ~

$ p$ x1 G% h5 @! `- H测试结果如下:% U$ Y1 z! B; z, y- k) n, Y( N$ S
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?* x6 y- P9 I% J! ]8 A( u9 k

& e( X0 q/ `8 w) k1 l
. o+ N$ z! ^3 W8 \! t+ z备注:# d, f3 @" ~7 q3 K* ~
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' T( X- ?1 L- P- F+ ^8 |
2、相关代码如下:. f  q' n7 W: T/ i/ |
//UPP DMA缓冲大小512字节4 O8 Q+ a7 ]4 m/ d
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 C) ?( E# J' L! v1 X* {
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* H1 X8 W2 V, [5 \# n3 \#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ E/ t2 j. @+ U
! f- \; Q1 s% |

0 p! X4 Z  ^+ C0 r' {' A//upp接收、发送buffer# n) \( ~6 Y2 M1 k5 @% E: t
#pragma DATA_ALIGN(upp_buffer_a, 8)
+ ~6 }/ I/ B& w9 f9 w. W+ r#pragma DATA_ALIGN(upp_buffer_b, 8)
# S8 g9 b, N. ]' H, V
7 ~" P, o6 n+ B# B- Z3 g) E+ p1 ^, runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 ]' p' g& S. @5 G; P+ Kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 X( }* Q1 F6 {* Y2 o- {& O6 H0 e3 ^" y+ |9 j8 C2 S
5 B$ @1 v% O4 A
static bool server_upp_data_recv(Server *server) " B" D% v. O! @9 o% r, W+ \
{+ K. E( y% X2 C
    if(server->upp_channel_a_recv == false) {
/ x5 ]" Y3 N' D        server_msg_send(server, APP_CMD_LOG, "upp recv: start");' Y. t" t- n. l
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {4 V: Z0 u" K1 \+ s! v  X
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
. T# {: y! X$ Y! Z; Q$ G2 q! U
: \/ u2 G" k" v2 x- Y+ t- g+ p* [
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 |  ?+ C" J! n, D2 K7 n
- I# K1 _: r2 L; I- b4 A            server->upp_channel_a_recv = true;//% H' }) k1 g  Q, Y3 O, r
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
5 K$ P1 q) M* d$ e) t% |2 ]7 Z- [, \            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
: b) Z. V/ }8 O; j7 R" N# h: s* P            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
0 w, b  j2 E+ y( J+ |7 @  t$ ~, H            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 q; t& |( h# y. E) f! `

- {) F& s& d% o4 S9 h            upp_error_count = 0;* Q, `9 m9 o6 p$ h: _  P7 Y) J6 c
            upp_dmai_int_cut = 0;
. O; @6 r8 W! C/ p% H8 Y
/ S; J. q, e% W: y            // fill in data 7 e( w4 R7 ^2 P) Z, v7 Q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. C0 f  A6 s+ @) E2 U4 }0 ^3 s            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! V5 B* h5 J1 G; S! p" x        }( B4 }6 Z" Z8 Q) H; W* [- Y
    }
( o8 D( q" K2 d4 y" N    else{8 x+ ?" |4 P* d0 r5 n
        if (upp_dmai_int_cut > 0){
, \7 f9 Z  Y% H2 ?/ p            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ m, c0 J$ _  F0 i! c* X" t  x: P
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
3 ]' c# @5 i9 G/ s  d+ O; Q$ j5 A* p! b/ B3 h7 l, l  l! Q
( T$ A$ C: Q9 R
            //copy data to upp_recv_list_busy
2 D8 K7 ]7 L/ d# E* h3 A; }- h* h            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 n  a& K% S# O+ A4 U; w
* U. C( `' |! k7 {- _8 l; U
            //& i. m5 g4 Z1 _/ ^2 g' w) H7 V
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);9 U  H: y+ L$ k' k1 A" {5 R5 s

0 K. {$ H" H: l4 ]            //
1 X+ F( U- F! j; `- l3 Z            server->upp_channel_a_recv = false;//% I8 |- H) V( h) q

* g; H9 z5 K+ z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");# r( o. p2 J! u& m+ t
        }
& O; c  N' `* O  U! m$ T    }
/ l; }( q% a& i5 d+ B
2 `; w! x) p1 Q( f5 V' ^$ X8 ^' L1 q' ^, U2 @9 p
    return true;# J0 Y- l9 C& ^7 S  R7 w! ]+ n. P
}
* Z& z% w. y+ K; Z1 X; J, }& A( _5 C# Q* K; Q* g
static bool server_upp_data_send(Server *server)% C# I; P" X8 ^/ Z
{" U" o) ?+ g( L1 {) J3 X
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){) q9 G& t: G$ f3 O9 |0 a& E* D
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" J+ |; @; p2 O0 ]        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
: w5 t: u; }/ O        char tmp[128] ={0};9 {# n3 B1 f6 ?: e  k& z3 Y) E( ^/ ^
$ @5 |  P: L& u( D7 m* ]" \
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 W! e1 G8 K. M! Y* m: I        print_log(server, data, 64);3 v; p! ^+ x, W1 U0 Z4 n1 m
0 Q9 w0 {* E) D; l* S$ W) E
        //
, l0 \; D7 [) C        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, {7 K* y) p/ Q4 E4 J6 R
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; ?+ W/ a) [1 d
        print_log(server, upp_buffer_b, 64);4 O8 l6 g! P$ N. ?( Q( m% ^
( v$ z3 r. T, K! m; g' r$ j
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) O% b3 k1 B2 T2 A: ^; G
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
" J) a! H/ I! R9 v* p; p        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 n7 o) A. }- G* r
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: ?2 \/ m6 q4 D  V

% k  N6 W# N1 E- H2 M        memset(tmp, 0, sizeof(tmp));
2 J) c! X1 P: ]( C. R% d        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) `. M7 n: i1 n$ Q. u. ^* [, }, E
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
5 v) y' E* Y* i. z+ X        server_msg_send(server, APP_CMD_LOG, tmp);
: i2 L6 _" ?; u  W$ O  y# x# L! }, ^/ P- s+ q
        upp_error_count = 0;
; r* C8 l2 X1 R, o4 u  H        upp_dmaq_int_cut = 0;, L, I% z& _4 V2 T7 a1 C! E- o
        // fill in data
2 i3 L9 I* W" b        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% A- Q1 Z5 a: Y$ L- p5 }        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& t7 C, y$ P0 z8 o

+ E6 J7 m. w# R' V( V) [; P  F        // wait send success
; Z$ V/ |' }! L( p) g) t* x0 g        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : I! H0 R2 R' u* w. @* K+ v

( Q( M; e5 S& T4 m        // make data node in free list
. W7 Q% F9 g, h        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- i2 u1 J& I6 j' N8 y8 B  R# w! Z" U/ c3 I        server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 \# C+ w+ e/ D3 P2 x6 m    }; K1 \  y; Z6 A# h0 V4 z& o
    return true;4 h- H; c' u! J- g
}
7 h: _4 o7 |9 J" Q* W: p" L8 j
. C- g4 B' A+ ^

1 E) |$ l9 \8 g4 ^! K+ }4 T$ K
/ q' U' E" F# R: `: }

9 {; D, `0 {4 e+ n/ g2 y  o
3 S" A" U1 L0 u# l" y6 F; u

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐8 }6 s* A7 U6 o3 f) D

$ t9 E5 _  a; g% c3 J3 \

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 17:02 , Processed in 0.042164 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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