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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 e: v# k/ y3 t

4 ~$ e' u4 x! y3 `5 a问题描述:
; R$ q  d9 j9 G4 D+ g: \在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( z' T* ?  T6 M% }

' T2 U' w; P& Q3 S! J; m1 f3 X图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。- ]( [0 k& }, ?1 c' f9 g

7 `2 |* b) p9 @* Z: n9 h% q测试结果如下:7 a6 W; d/ N( y5 r- l  F" o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 @0 W) ?) I; H1 ^2 {; L6 i( h7 |; C& J+ I8 F, j
1 W( `' n. C) I. V" @5 D
备注:/ n% r, ?# d9 s" F& t) d
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?! M8 \! k, `# S7 O
2、相关代码如下:1 |. K/ B0 K" K# k* V) W
//UPP DMA缓冲大小512字节
3 t. l( ^" r; n6 M; c' R; C#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 J& [  P1 V/ s8 k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" z5 Y7 Y5 z% w" Z, m
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)* j1 d# V: y/ Z4 Y5 t  a1 P& A0 s
1 @" H" I  F  W4 ?7 E6 W4 E, z0 @

6 p( n& Z, }4 K& O& e8 w! ]5 x//upp接收、发送buffer
4 {1 K4 g# k% c! O+ _: ~#pragma DATA_ALIGN(upp_buffer_a, 8)
# S/ J% T$ s( h0 `) h$ O1 u#pragma DATA_ALIGN(upp_buffer_b, 8)
; L) E: f6 p* `8 C/ j/ p; {! D- p$ y) E0 m" J
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' _6 a1 b: ?& i& T' z/ L4 d' eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];0 _0 Q* ^1 s9 y
4 A) k: z% C8 s2 u3 C. t8 W. F

% A! |' J2 R. k" q9 s  `static bool server_upp_data_recv(Server *server)
( r$ c0 r% K; p% ~/ x( X{- R9 O& J1 M3 `. t
    if(server->upp_channel_a_recv == false) {
7 \# V3 r! S& }: P. `: v) {5 A) q        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, W, z" L2 f/ X, i        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 O3 a& `( [% y- @0 j
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 {. S4 F% e: `* W( A

5 ^. e* y5 \, ~
* B. B3 @& g! |! c4 w2 ]4 r3 Z6 H( G            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* E( M6 O  E; Y) t6 Q1 }" g
5 h3 m3 m2 i: ^1 o            server->upp_channel_a_recv = true;//, U$ e0 Z' K/ u. g5 g
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! k% b* }& I) |
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;4 Z% N+ K6 B( `% Y
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
# R) T0 U7 S1 G( H% Q4 P            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
* K# g$ N3 L, d
. }7 x) \4 O% Q# r# ~2 Q            upp_error_count = 0;7 F. i* {, p4 T2 k& u
            upp_dmai_int_cut = 0;1 f# k7 K2 Q. ]5 V7 B- S
8 a- z% N2 }* h8 I. i% J
            // fill in data
2 K" q. q; t+ W3 v0 c$ F            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- M; A7 o+ [) `6 Z- {& Z6 g1 Y
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
; ]0 N+ a8 p) g; d        }# ], w! x3 [, d- H0 i
    }5 G& N" b7 B6 Y
    else{
% [0 a  C& y6 \1 A        if (upp_dmai_int_cut > 0){
$ t& k( n( a8 y1 |& c            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 i* f3 f) c0 k" \+ t8 g            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# F1 E9 I; q% i/ u% T
! x9 z( O' t" ]3 W! j; r) n/ s3 N& j) s2 `$ x/ N4 ~
            //copy data to upp_recv_list_busy
1 _. n6 v  g9 Q' _% [/ R) O* Q! R$ e            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
- z6 t6 }* m- T; W+ Y1 c& U$ v
' r$ ]% a6 U$ d            //
6 [2 r+ o# G2 b4 x1 r- ~            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);. W- ]6 H0 T) k
, g" p( U6 D: M' A2 l1 ]
            //
  J5 X9 C5 A+ j- ]" D            server->upp_channel_a_recv = false;//
0 Y5 Z6 u' M8 p! \
0 m6 e$ G/ m9 U+ [+ l: S7 `            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
) {9 u! a" C2 p; \, ]/ a        }
# i/ j3 o' P# F    }
& t, L( f7 G: K( D/ L2 O+ H* }0 t4 o9 G

7 N5 W2 g2 l* [/ U    return true;0 @. g, z& s! c6 A! B5 u
}2 q. X& e7 o- R
: n: Q' Q# a; l% ?/ ~
static bool server_upp_data_send(Server *server)( n" Y, m( B2 g  Y% t2 o+ f
{' W  g# b/ w" b) l( m
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 q( [3 n+ x6 L* g% |1 P
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ n+ @( y3 C% B+ J/ H
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 ^8 s6 _9 C$ c5 r( `
        char tmp[128] ={0};
$ e, \+ b3 {# F- e& s& U
) s. ~1 y2 d4 m' a        server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ g' S  h7 n1 S7 e; ^        print_log(server, data, 64);
0 K- ?% U2 Y1 |9 P- ~. g0 X5 h
# l/ E8 b4 G* x) p8 v5 `  w  |+ E        //! A$ v! o( T: I  l  o% w
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' s6 N+ a, V" Z# `  U5 S9 r/ ~( n        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  Y% z" D$ U/ j
        print_log(server, upp_buffer_b, 64);5 D. d/ Z$ V! v3 ?5 ]. G

0 Y$ i1 ?+ j# P* J        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);0 _' J4 o/ @& M1 @
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
1 Y0 j- C  x  M" l' @7 O  @3 o        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
/ B+ V7 j9 j! P( |) ]1 r" |        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 F  X+ I: d; \; y, K+ ?! w

# D% @+ }" ~8 p/ J/ L        memset(tmp, 0, sizeof(tmp));$ p- `! f0 d( N  |8 f
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) Z" r- ~0 j4 o, F; x( b1 D
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
6 a7 ?: m* r  {/ m6 {9 Q6 v" }        server_msg_send(server, APP_CMD_LOG, tmp);
& m+ [' f  y9 B. b
$ G/ ~1 e. P" U8 V0 Z7 i3 V8 q9 P        upp_error_count = 0;
6 P8 y( x& I6 h! z        upp_dmaq_int_cut = 0;
9 t' K' [, a3 l4 u( F  [        // fill in data ' h9 L, P4 o& ~9 O" C1 v
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) h! ~) k1 {4 a! c7 m- K) \
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# p+ v7 N# b+ R

) r0 Q' q! y3 ^        // wait send success4 h1 @  n, l- B5 w% L
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' J5 E! Z8 y! |* `
* u$ y, A: j& V( g        // make data node in free list
" I" O( O; ~) z4 x        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) x  S: p" z2 b$ k/ `" C$ ^        server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 Q# z+ u$ j& Y3 r$ o/ {3 J/ t    }% k# X9 G8 f7 p
    return true;3 \: f2 j: |+ M% i5 |
}
0 t4 }$ S$ p+ c+ Y- ^# A
4 l! @# k' O" c* s- q
- O# l7 G( I6 ]/ e4 y# E* W$ f+ x

  M) l% t, B7 L& I

+ w5 M0 r" \- r( |3 G' X, ~& X- E, C! F" C# g; s0 ^7 I

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐" h1 F6 P, w9 W+ K
8 l  l( Z- o% y- E4 r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 09:47 , Processed in 0.042781 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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