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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 O3 z+ q' d& t) t- M' h
1 p  z/ e" e. Y' |! R% [; n
问题描述:
$ d2 {) [9 k) D3 {3 [在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( d. c# n9 j& l# p. K, c/ f
6 I& ^# e% O7 D! _2 C' a8 E: S
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
/ u7 U/ j& \- n+ |8 j5 h. N, C; d4 h
测试结果如下:
: n9 j4 C: _/ @138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?: ?# O; X, J* m" W2 ~
) s9 a8 _/ m. A: O7 h2 c4 n
) J3 g6 E* j/ l
备注:
, @* K& i8 W$ F7 P" Z, v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?! m5 \* m: e+ ]3 o: b
2、相关代码如下:7 E, o/ E8 P1 W$ v+ z) R! r
//UPP DMA缓冲大小512字节9 M! T7 Z# F( L0 C" o/ K
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ \# W( n+ ?6 N0 T! `
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT& B' x# n- I( S! b& W) _0 ]" D
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)+ M; X  k4 }" J% S3 n5 R

* Q! T% }5 X. A/ X/ _
7 a7 Q% b. q0 l4 {//upp接收、发送buffer8 y3 K* a" n! {4 N/ y/ ~# {. k, |0 I
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 F+ c( y6 E" j$ y0 X( M& Y. X#pragma DATA_ALIGN(upp_buffer_b, 8), o1 G3 Z/ L2 ~6 v

% l! t; e0 m& b0 Runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% A  W' {4 ~, _  Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 s2 p2 x+ i& j
# A; s- b! f2 E
. X5 G5 d: L7 Q, S+ g- O4 ostatic bool server_upp_data_recv(Server *server) + F: d' F" F: i: @& ^/ G
{8 y3 o$ l% O; T1 X
    if(server->upp_channel_a_recv == false) {
$ C) F) a1 \4 e$ @- D        server_msg_send(server, APP_CMD_LOG, "upp recv: start");& m6 F) u1 y# c7 X. G
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; X% f9 j% M  a0 i
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");: H' ]3 Y( z( j
! a5 P, M  a! ]3 \. p3 x" Q; Z4 o' j
# r  x$ m# R" _( x$ X- v# U1 M
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 P  m* `; W1 m# U. {

" c3 q5 O; L2 L" J5 o7 t            server->upp_channel_a_recv = true;//% g- i8 }- ?( N0 ~' Z: B
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
' Z6 K+ I9 f1 X1 }+ M            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
# I) H9 H6 I9 H0 e            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;+ o0 N9 J1 r- v% h4 Y
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
" `4 G; E! q9 I; ]0 E1 y, x
7 w" N6 X, O1 r& R( o            upp_error_count = 0;
0 ~' {! B: }9 I+ R  R* Q0 A+ |            upp_dmai_int_cut = 0;
# Q0 |! X1 Q2 N& g' d
8 i4 m8 J) Z9 h3 V, W4 n0 C            // fill in data ! @  l* N" P! |
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" o1 s  V" K# p6 i/ ~- K. D! w7 t            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* r$ _8 Z" L8 s9 U% s3 u3 u        }
- n6 s6 D) D1 Z    }( M  ?4 V3 f+ x4 f
    else{& @; B0 ~' h* v6 d
        if (upp_dmai_int_cut > 0){+ O" {. f7 v4 f5 }" Z! X4 O6 ^
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' h, b( b  l' _# _
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' P: X, D% M: k8 S& c# o
0 |# O. C* Q! L, S
8 J" s9 M* T6 A; J- w
            //copy data to upp_recv_list_busy
8 `/ {' N0 A7 A% U4 ?. m            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: ?- p0 h) _" ], c: E1 d
$ [* E* a: j- j' K( g1 W) L* n            //
9 N# C/ ], {- B/ e4 z0 ?            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- P- F5 J: E- N+ D; O- t* T) ^2 J  z/ i( {
            //
! J/ g' i3 v5 F            server->upp_channel_a_recv = false;//! ]6 W3 ]/ f+ ?' Y* d
% l$ @9 Z$ T9 R! A8 ~! g
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! l- G! e3 q" m        }
$ M( V- G' |/ s% B0 ]8 u) N    }
0 }3 i, W* N3 {3 M, B! x# h
, t2 z# o  I7 F9 o4 X# L' _
* ]7 N' [. T7 W4 Q3 l    return true;
6 K; O6 @' t7 D/ E) R}
5 R1 c$ f( [% n- m, S& ^$ n( O8 ~! h, _! R, t
static bool server_upp_data_send(Server *server)
+ G. K6 p, x4 o/ F. ?{
; c) b/ C( M: O' F    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% s$ T8 r4 Z* v2 K# ^! y7 A2 ~
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- W+ a8 [: z5 |, H' M" Q/ h
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ `3 p" |* t0 B1 u, H        char tmp[128] ={0};
/ ^9 Z+ z# q3 a& P& h7 W: K1 U/ r3 C/ S/ {, i3 g* {; i
        server_msg_send(server, APP_CMD_LOG, "upp send: start");: c/ |8 k" e- H
        print_log(server, data, 64);
/ ]2 f) E* T: E. S7 S' s
* t5 m! `: P. v: \8 g        //
+ J4 W* U' h: S3 @: P        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ c& M7 B3 F4 e. v% M, }
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ E; R7 T* h/ R4 ^7 y        print_log(server, upp_buffer_b, 64);
. \- D' `1 O3 e( M. z
3 L: J) C' e! [( C& w# l8 l% I        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);& O  z  G& T4 r9 D
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  T) s& U& }, c% {3 N4 G        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;0 L5 W- z2 m2 x: U1 K7 H
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ j0 l- p& z. l; @# D

' j1 r; Q9 i' v; x        memset(tmp, 0, sizeof(tmp));& i* _: j$ ^6 P0 N4 K6 M
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
; h5 T: H" s" x$ ?            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
3 A1 o5 W8 K, j# M0 c/ Y        server_msg_send(server, APP_CMD_LOG, tmp);/ |8 t# h- w8 U4 o& ^( Q

1 s6 F" U9 B$ }# S% j( T. ^        upp_error_count = 0;
  W% N% e( V' ]! S, O        upp_dmaq_int_cut = 0;# ^1 a9 J% Q9 g
        // fill in data - |, |9 j; _# T& W& _5 t' c4 w; `
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); : h( L& r% ~) m  n5 H
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 s) U2 e. ^, D- L9 }$ O
  y' m& p% @! Q+ S" v# H1 m5 g2 y0 F
        // wait send success2 h( V/ _# o, D1 R! {' ~
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ }& i: D" c' {. ^* h1 t2 g8 c$ o& F7 b8 q
        // make data node in free list & f0 @% m9 Y6 a2 ~' ?
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' f0 r- v2 t( s: W7 d8 K& p
        server_msg_send(server, APP_CMD_LOG, "upp send: success");! ~5 b" S# u6 W# X
    }- m; R3 ^5 h; ]/ B/ u4 u( ?
    return true;) x3 g) Y8 N3 I) [6 S" Q  q0 y1 E
}3 N3 X1 G: c) ^7 _( p5 S
2 t: E. L- {! S
9 S' J5 o  N3 F0 V
/ \- p) w+ r' ~/ B5 h0 p. v

# Y4 A4 C; k1 q' y, v5 f% [
8 m' `0 y5 @9 ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
0 U  z, h* a7 c: M3 r+ |$ }$ R8 G# W

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 20:16 , Processed in 0.042769 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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