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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 E, z5 j  g1 X: P. [& O/ }0 W3 V" @( F1 l
问题描述:5 ?: M, ]. ]0 a. G+ z% z# \. e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ Q' V4 A" X, n) G( |0 z$ X3 u
0 d: d1 M4 g1 F: `0 ?2 L2 W
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. k3 D9 ^7 J5 Y/ `

+ h( \- n" J; |  {* V2 M测试结果如下:
3 V9 s* p+ }8 K5 P  U4 X' w138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. B$ P& L8 m- X2 w1 l7 g

8 G( D. U7 L6 d; H! r, C. Q* G, o* u
备注:5 f" ^- w$ j. M0 c5 X4 [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' U; ^9 {5 a" R4 p+ g2 b
2、相关代码如下:
' H: W4 I" W* N, L4 M+ t6 D% N//UPP DMA缓冲大小512字节* }+ q' i. H0 l9 |  N+ t2 o+ f$ J8 R1 m
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 r( o0 o  c  A5 p6 R4 ]
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" c- d( r5 l  A% O4 {, P& \/ A) h
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 r1 L2 n4 M  m; f

1 x; E7 X* \2 @% V4 N: X& s; c- T- `# e
//upp接收、发送buffer
% ?7 X0 W5 z* P3 ~#pragma DATA_ALIGN(upp_buffer_a, 8)% `, D, O- j, o& b+ w8 p/ A1 a. J
#pragma DATA_ALIGN(upp_buffer_b, 8)
! T3 u$ j4 B( M+ t: [3 ^6 {" I
5 }# K1 a5 R6 x# G$ eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! j' P  |& h- q. Y: \# ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: }$ b# h6 `& G7 Y- ?% D/ R) n( a& _: a, T8 f
- P. d- X1 v& O  J  D
static bool server_upp_data_recv(Server *server)
5 o# G) i5 q0 O! l$ H* f{
3 ]( G/ p) p- W' q0 ]    if(server->upp_channel_a_recv == false) {6 Z3 T8 C% v# H( G# ~
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");) g: N  l. k2 P
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" H& n0 p9 I. E& k; ]7 C
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 Y( g0 a8 b# ?; C% Q% F

3 p6 l/ K. x3 b. o  s, G# y$ M2 ?2 j( _4 B" p$ \/ K* S) x  j% D
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
6 ?; o$ D) y: M4 j; J, k4 ]% Y. y( L  Q" r# t
            server->upp_channel_a_recv = true;//  y* q6 |2 L8 b9 w
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
( `2 B, W1 W1 b; `: Z' n% ^            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;4 R6 \  V. N3 _- P$ ]! w9 B4 Q* T
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% m+ O1 n& a; H+ J/ t6 j6 x
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% v/ M/ m3 P. E" b; j% j
7 l% w: Y, k2 ~, p+ x" w# e
            upp_error_count = 0;, P# d* c) W! Z5 O0 E- W5 x/ M1 y
            upp_dmai_int_cut = 0;
  W& d. t( Q4 n5 p: \6 R- n1 x# t0 {" `/ ~
            // fill in data 4 G! |# p7 `6 k+ ^
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, e# u* G+ k+ R' G, f            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
$ ^: i# m# n# ]5 k) ^        }# C! f2 S  h: u* ], Y
    }
( k7 @, E! O$ E+ u8 m0 L* E8 i    else{& }; {5 y: j* g! r0 J& |5 ~/ `
        if (upp_dmai_int_cut > 0){: u6 C; x5 H$ e7 y6 e
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
# {% z0 `1 j4 G! z3 a( g            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
; U! R9 n( \+ M0 a; g
! o3 R. i1 q5 L' x) P* h, z8 n8 i' O9 K- Q  U
            //copy data to upp_recv_list_busy
% k: v1 V/ p/ N3 r+ V4 v# w3 X# W            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 f3 m. C" v7 n

, ~$ F- Z! t4 |/ I. ?, k- R            //# P5 y# U0 S! d" Q9 Y+ V
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 p/ n' ^$ N4 q+ k: V/ l9 z0 E' M% c# X
            //4 ?4 o* L! T( o; M" h
            server->upp_channel_a_recv = false;//
  {3 R0 G! H, H7 v
* M( J& s& B! j8 ]! U3 J1 z+ Q            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 d0 u- X$ W. g1 E$ }        }7 W" }4 j3 a, f  s0 |
    }
% T' O, _& w6 d
. L: R2 m+ q$ V) _
% I! F9 S7 q$ g# M' n    return true;- r7 I; L7 P& H3 P' F# h& {# E1 O
}2 `- W" J0 J% Y8 W( o1 B3 U! Y
# `9 D. H8 C0 Y
static bool server_upp_data_send(Server *server)
- D, Y6 a- ?( q. S{* t2 P4 c+ z. M$ e
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ g1 Z+ G  x$ i+ r! U+ e, d( \        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
" H6 H5 j# w& Q0 S( {5 s        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 I2 n; ]% ^; D) f
        char tmp[128] ={0};2 |2 a" Z: r1 V' d
. i: L+ x& _9 }' f
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
, e1 J: W0 b9 E5 S        print_log(server, data, 64);
& w4 Q: p8 Y0 J1 \, w$ o5 k: \% a0 I: N0 l
        //- @+ f5 [8 b0 l+ K& O8 g
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 b9 ^7 V: |- W3 v2 A        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 c5 X% I5 ?3 w8 o
        print_log(server, upp_buffer_b, 64);+ F+ `2 Z0 X3 @8 t
1 ?6 o( o1 S2 I+ x
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
' L- y# _! m4 B- |( p        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
# T/ x  b0 y2 ]7 ]0 I2 b  h* }) j3 L; |        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
& s  i9 N% Q3 Z4 w        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 T* X7 t5 ?- }  m) |  G3 x; u

0 l$ l2 n  \( m5 {9 s        memset(tmp, 0, sizeof(tmp));
( }6 {+ R1 a: i& N# W1 w2 L        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 a4 ~1 z% y- j  H+ d% t* N' |            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 d- m" q4 u: j8 o- w2 l) D6 t$ l1 y" @
        server_msg_send(server, APP_CMD_LOG, tmp);
8 \8 L: u8 m6 d4 F$ e3 U% I
. V' w& d* Y: A# \6 d% b        upp_error_count = 0;
& q" A: U- b4 [+ T2 K  @7 Y! C        upp_dmaq_int_cut = 0;& c6 _) P5 U- |  q% Q
        // fill in data
. j: W5 M! s) h+ c( a/ n" v        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , H& o- p( I% K( P+ g$ {
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" O% J* E& o% s

$ t1 l1 r* c5 z7 L5 K( U; c. T        // wait send success
6 w) B& H$ l% O+ b* ^        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - ]5 j% J  V  T# Z. q7 l1 Q

+ ?, D* P, F- B- K        // make data node in free list ' v1 ^: ]" h- O+ O7 C4 d, ]2 p
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
, q9 M, \* I% N2 J5 I" Q' X        server_msg_send(server, APP_CMD_LOG, "upp send: success");9 g+ `+ Q# @3 _0 D+ }6 m" M
    }1 G% ?- h9 A: M- o8 a
    return true;
+ R  p& c' z- E& I. U* L; s}+ [" k0 F8 C/ E, [8 F' u
: |7 u8 j; ~$ V# [

# ~0 j4 q# Q& x/ P  H9 S6 k  y2 }2 t- d. V6 [" n$ Q
5 j, S, w% J7 W1 l/ j% [5 M

$ i+ J( |+ p; W8 {* n; [( R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐- F# W6 o4 G8 g: {+ q# v
3 _1 n+ q5 g4 }  ^; E1 J# _

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 21:37 , Processed in 0.042549 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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