138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
: r' Z# x' ~6 A" O& n5 J! _; u9 G4 U) T) n8 E' e* w5 u  j5 U
问题描述:$ y$ U! I; Y" b$ V8 e) d' s6 x) b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 o! L) g, G2 ^: H0 f! L1 p# U

& X& E9 F+ c: S- Q4 f图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! E7 `- f( t4 c# A" y& d

% M% o+ ^* y- @( l8 S7 O测试结果如下:& x2 ~; t  }4 _% t% L1 n$ w2 B' j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) F5 ?  X0 R" F' D" ~
7 d/ x" s+ D, E& p* W7 q& c0 T0 P
备注:
$ }* z. A1 ~& k9 y- X- @+ C8 F1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) b5 ^  g7 @( R+ ]& f
2、相关代码如下:5 [/ t* o) Y" G: F
//UPP DMA缓冲大小512字节4 {9 f& k6 |4 H# V0 s
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! V0 b9 {/ z' Q; d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( N8 Y1 Z# F; ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ D3 B* |. a* K. ]" s

5 }: C* i3 t, i: [1 u# D6 m' _# s) g4 f/ ~
//upp接收、发送buffer
0 `' b6 i& h- C#pragma DATA_ALIGN(upp_buffer_a, 8)
4 D7 Z6 R& B9 t( n#pragma DATA_ALIGN(upp_buffer_b, 8)! F$ j9 v' ]. r& F2 }2 ~/ w& S

( k9 h/ j' D% ?unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 k9 N' s) E' }: u! y) w
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 Y- C4 d3 T) P! K; A' z
+ T* g: {; H' }2 S- Q: B
# F% d1 G3 k; u, a# e% z
static bool server_upp_data_recv(Server *server) & F/ f- f; x; ^
{
& F- m6 ]7 f. B. ~6 C& W7 _" z    if(server->upp_channel_a_recv == false) {
- C' c$ U% y" m  i% k" d* G. @        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
$ y3 i8 {# a$ S9 {# `        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( T) {$ Z! e; R( u            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' A( |" K6 ~& l8 T
( m$ g7 }6 m* p1 `
% A. u" I% }$ C6 J' c- X$ S" x. e            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& M- ?( }/ b" e8 d+ e  r
( [6 s# y) `& J$ I            server->upp_channel_a_recv = true;//
" |  O  B+ a, }/ K9 ~            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# p  v0 X# ^- ~, R9 \2 ^2 ]  f            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 S1 \$ H: |3 t6 b
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
" x0 B7 E/ [# G- j. u: l% M' y+ Y            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 A' f# j+ B/ L, ?
' w, P9 I6 u0 \( T            upp_error_count = 0;
3 e5 o) a1 m& S- w            upp_dmai_int_cut = 0;
, X: m# W4 [6 s6 c2 H. R0 g- \6 W# U' e/ B
            // fill in data ! h7 d- s7 F! B7 q: x+ |9 w* i' a
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' V5 O4 m: V, `" W/ i* _
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 n- I0 C. i* T) f/ r
        }
5 D: m6 |- t. q( N% e1 \% ~% I    }
' r/ ?9 ^9 k3 ^, I    else{6 n: K; s/ `( S; ]& u
        if (upp_dmai_int_cut > 0){% A* l- Q0 J5 q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 K) I/ f5 b7 v- d+ Z4 y
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 @0 H% F9 M; C: Y& O% ^

& a+ R- x% Q/ i/ }" C3 |  m* M4 U9 j' N- x: U+ ]
            //copy data to upp_recv_list_busy6 r0 e% k' @, P2 k; c5 e- E  U
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 l  \, l* u9 r/ d- Y# k& n7 S
% _2 p& f) R: ]* n" r: R3 P  u            //- b' O& @# F3 l0 m" Y& W
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# j) v$ x, P1 w8 V; w3 E7 M, ~

1 ^3 j- U! a0 _4 T2 p& ]7 Z            //# Z0 u' `. A1 j# j! D
            server->upp_channel_a_recv = false;//
9 f8 ?2 B% t8 _- E( `- O( a8 K1 M8 m) E2 ~
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 u( [; d! {/ {  c8 F- c        }
  \! x8 i6 `& N. \5 F/ v    }& [  ~( y+ a8 K4 f. k

# M* O7 Z1 `6 J( R' }
6 Y4 q* I& E* \* k    return true;
& Y9 D1 z1 X) f}
8 G3 b. _# W3 r! E' F! n1 ?# j1 Y/ V% \- }. j0 K- a
static bool server_upp_data_send(Server *server)( @$ N) R$ e0 r. i6 r
{. E1 n2 t( I) h, O, b% J
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
8 }. \) M9 b7 `4 V5 a/ Y0 T        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 u( R% M* }* b- n# J& b        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ w, |' ~7 Z8 D" B" K
        char tmp[128] ={0};
7 I& j" E* ~7 x6 E, H' A
1 i. u6 _7 F' P* ~        server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 i8 I" r+ I6 c+ u+ X# s        print_log(server, data, 64);
( i2 g8 P5 d& ]/ u3 C
/ o6 i' Z! u  g$ h        //
! ^6 I. e9 x. r/ u& F$ [+ B& k        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
5 V9 _2 ~1 k, x" z- v% x% t        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
5 m' w- _' K' m$ ?' K% p        print_log(server, upp_buffer_b, 64);
8 |7 z) l8 z/ b) C2 e! j
' _8 @" x: U% T' B3 Q        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);8 ]3 E6 }7 U" J' ?8 |5 L& C) s$ F
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 0 }9 D, k5 v: p3 a. V; f) E
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
/ b% G% l7 m8 ^& O- }        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
  ^$ {& u5 ^+ X8 f  e8 a% p) `! r0 B0 ^- E/ {6 Y
        memset(tmp, 0, sizeof(tmp));
* ]) k6 [7 t# q+ l! o4 M4 ]( l        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ( }6 ]- c* Z& y8 x
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) m/ q0 v/ C* _7 Y$ w' Y        server_msg_send(server, APP_CMD_LOG, tmp);
# q3 a( \8 }0 e4 V% G" H. S
. W- q' U% r% y9 z6 G        upp_error_count = 0;
* G; d1 [& V4 |- y        upp_dmaq_int_cut = 0;8 `3 b" H/ A# z; h. L  S
        // fill in data : g) C% B. A$ o' R
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 j9 D2 [5 M. v* m: I8 J' D
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");  s7 `, \' Y9 d5 |  Y* [

/ |/ |& j( A0 B. l* i        // wait send success
0 V1 h1 y7 y2 [4 c7 ?8 o$ W" I        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ r* O6 k# A0 O5 W$ O! O

6 ]& z0 b, x9 k9 R- }        // make data node in free list
! r% {& ]( n* u  C9 x. r' J        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' V# A9 E1 x1 _# Y" L+ S
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 ^1 L8 }8 X/ M: i& ^    }
2 X# V; u) m+ i! U    return true;
. J" I" W+ a2 o# q# b: A1 K}
, o" h5 `# J& E: o; v. G# _; n
& D3 R# J4 m- R

$ p1 e6 V9 T# c6 ^+ X0 W& D, t0 g6 U+ J9 r8 B6 |9 K

) r& S4 X: A+ N$ f! ?6 k& ^' Z' r- `- B5 ]) i9 p# N

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐' U# \9 C4 @4 ~$ h( r/ d2 {8 z: c
/ C3 J' x/ T5 d: w: h

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-24 19:37 , Processed in 0.048832 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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