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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 R8 c5 T. V' N: Z( \7 Z/ e5 d! F, K& A0 O# [) d0 f$ P! y
问题描述:2 z+ p) k0 p$ e( E
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! r7 w$ N' q$ |) z  u

: u( `; n& @9 y  l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 B9 [6 j) w! q4 Q2 F, n: g8 I
' {3 B7 b; W4 B5 q! Y2 m" O% N
测试结果如下:
' J. w- V' H. Q* t, \: P138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 `/ W. u  L6 E* G- I" a- m

# p/ D. b. ?& _6 @7 X, K
. d; ?5 e$ i$ x# k! a备注:- l& T) L: l9 L3 @$ u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?  e9 f" S4 z$ t, l8 W6 v6 \% O% q
2、相关代码如下:( z1 V* L9 h: p! @# F
//UPP DMA缓冲大小512字节9 m/ X( M! e2 e$ y' r: ?
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍7 w. X7 Z  V1 p8 A
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" ?: N! `* m1 s- r& l7 ?8 o* t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 W% h4 p* j' N/ i+ ^: D' d6 ]! h5 W( Y/ A- N
( P2 w" R& @" U
//upp接收、发送buffer
6 s# ~3 c  {8 z' L#pragma DATA_ALIGN(upp_buffer_a, 8)
, x4 ]# d, D3 d6 e#pragma DATA_ALIGN(upp_buffer_b, 8)
5 c) A& @, u- i7 g; N9 G: j' T8 Y- P( O
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];6 g/ ?  a2 g' l% F( b  }
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];* G/ n3 s: B2 f* F
  [& T* B7 e+ `
2 D& k+ I) ^; D  L" t( j+ d
static bool server_upp_data_recv(Server *server)
( t3 s$ L+ {/ T9 Z, G) K2 x( j{) C* m& g# x% l8 B5 x4 r
    if(server->upp_channel_a_recv == false) {; ~2 P4 T* p) D
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");# s: c0 a! e+ X% G
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 w, _: U# K) X            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
& z! X0 y: X, C) `7 i! k& N# @$ L' Z. @# {0 t

8 i  M0 M, P% y7 Y( ]( e7 c            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);. a* y1 n: g. w. m5 c* c) }7 ]

2 C3 J$ Z* {/ J: ^: v            server->upp_channel_a_recv = true;//
9 u+ h. d) I' E$ F! }" J; ?            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);0 A  K) W$ ?1 m6 N0 P- ^( b* V! ]
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
5 r! }/ E2 U) X" @0 @6 Z' z            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
' y" e6 B) R  y            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- w! W6 U: Z, S4 i8 D+ t" M( t
# `" n4 \, Q6 ~6 g
            upp_error_count = 0;
2 v( A5 l3 @/ D4 b; x3 N! L7 K* I            upp_dmai_int_cut = 0;% `+ ~) }( ~" |

5 s7 ?" W$ ]4 i* u' ]! F! _            // fill in data ( [8 E8 K' n! \1 H) [: K
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
  B4 o, M3 S4 t            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. @7 R$ L. t# b) w% G/ E' x/ w        }$ m6 h. u, _% e$ q) A
    }
, P  B) Z2 @  R2 d    else{) M) C+ E/ x8 T
        if (upp_dmai_int_cut > 0){
" s- d* J+ {4 t" c            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. _9 C( h! G+ M% y  D
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 b7 c$ o9 j0 o# U0 Y
$ O- |! q5 }1 ?1 {& l, U8 H

9 o: [2 P, ?9 n            //copy data to upp_recv_list_busy
* Q( Z1 ~: g9 G8 c. s( |            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 V6 [% G6 j. h, {. ?3 t, y: w7 N, a2 b$ w- z$ A
            //7 ]' ^* _- O# j5 i& p' w  d
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
4 J- t3 g+ H; B5 Y- }  G8 h. q8 V+ r  a
            //
1 e0 f! z- W. C/ l2 I            server->upp_channel_a_recv = false;/// h& v5 m+ A# V, o# k
4 w* F' ~+ T$ i$ ]' Z0 M1 D
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! e  i: z7 M' A6 ^8 h  `& z        }
1 n: {  Q" O/ t9 m    }) G. |" f! w0 {1 t2 h

* s: p/ Z7 m( v- U1 y7 E/ q/ I0 o3 y9 p2 z# v/ A- S& d
    return true;
  c- a8 @7 e6 D. o}8 T% M# f' x) p; e8 U3 ]4 n* k0 i

# C" I' E% D8 Wstatic bool server_upp_data_send(Server *server)
0 H8 w, g. o5 v/ T7 C2 d{
2 q" W. C7 `! E" F6 J, j7 |    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% L7 F8 z4 W6 _. K
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);) e; ?6 l$ B3 r! g/ h: l
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ J9 y$ C- t, ^5 u2 R6 t6 c' m9 Z        char tmp[128] ={0};. e+ ~+ m7 Z) Q9 d9 \

( u# b3 U  h- ?( c  H; B& E5 S        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 T& ~2 A+ Y% h% J0 W$ U9 a        print_log(server, data, 64);
! J1 I' i, F4 q3 N  D
2 B1 C( ?4 H! i        //* R6 e$ d- |! o, m4 l2 u
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);/ z2 @1 [) ]2 u: t" \
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ [9 k7 S& B% n# W1 h        print_log(server, upp_buffer_b, 64);
; ]- Y2 U( W( W1 B+ c
+ R) X- T% h' f  V1 U        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
: l6 K6 b/ G2 t2 ~0 d        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 1 g+ v- X4 t) x& v# \: `
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- B. Z$ h8 L, K' d3 q2 b1 G& U2 s
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
" V9 v) o1 g; `2 L; g, Y) D) N+ h, B
        memset(tmp, 0, sizeof(tmp));' W( R4 C' n1 |7 \) U3 V1 ~. e
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
+ f. `8 h8 ^1 ~7 @+ ~2 Q# ~            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 g0 ?" _& j9 F4 i9 ?5 d
        server_msg_send(server, APP_CMD_LOG, tmp);
& X% H$ q3 D4 i. v5 w0 s. N: y, k  x$ d2 m3 Y
        upp_error_count = 0;
( L% t3 z4 I9 j7 \* r        upp_dmaq_int_cut = 0;# h& o" G. }7 t' E% h- s9 n! V& A
        // fill in data
4 C1 }4 W$ O7 d9 y8 @        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 B/ w& j2 {5 d: Q
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 B- q0 E$ ?* _3 `% q
4 y) r+ Y' g1 [5 |& Z+ S7 t
        // wait send success" E( c  c& k6 E% g( W' I8 N
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! P+ b2 f: W+ e5 N
2 c! T6 C) d; q; t" A+ v4 f- A
        // make data node in free list
$ V6 ]1 l! P  n        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. p4 M' Q/ L9 _" T        server_msg_send(server, APP_CMD_LOG, "upp send: success");8 s) Z# ^* C* {# X* }1 w
    }
2 [6 }5 A, s/ _( t: l! r6 j    return true;
' H3 X2 b  M& U# @, M8 O& ?}
: l. x+ }* R9 v+ x% C3 m1 z- S$ v: Q( _! A9 V7 c9 b( [4 m0 L3 A
6 D8 E/ @) ]& F8 e& a

( ~/ K7 ?8 ?! j3 [. `; k- L+ m
. o( F5 o$ `& Q: k

7 O  _, B7 v; a- E' x) L8 Y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
% d, v3 U0 ~3 M8 b9 @- {% Y; p! H7 P+ }$ T

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-13 20:03 , Processed in 0.045256 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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