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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, m7 M3 F7 i; _) j' u/ B. L. Y' z) [' S& I3 `: B" @# s
问题描述:
+ ^3 k  `% I) U! E% I在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; x9 X& O* b/ e$ l1 S& c  F
1 h( U+ Y2 {* Q! [  x5 d
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 z8 F/ V: p* a
; Q) |' Q. \  a
测试结果如下:
' B( }- F) O7 h" w( ^/ ]/ }, ]& _138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( Y% \+ b$ S" }
( j. X5 N1 r# t5 A# d

8 N! V9 k, G6 r. ^" f+ N备注:
' ], V+ W7 Q8 j1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
' z  p( R" L5 n  ~5 A6 G- K3 ~! V9 W
2、相关代码如下:
8 ]7 V! F" m7 v3 Q5 ^//UPP DMA缓冲大小512字节
$ _& f9 g, i/ J0 k- U% P% |+ X& S#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 s' r7 `8 j2 c: r
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 u/ W* i) f  @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 H1 s- p+ r4 J) _6 @

* u4 O( N- n( [0 j, X. K6 S( |5 z9 J' ?& l
//upp接收、发送buffer
$ N* S# G* v: D$ U  H#pragma DATA_ALIGN(upp_buffer_a, 8)* @/ {2 T7 M2 O) F+ N1 B! Q
#pragma DATA_ALIGN(upp_buffer_b, 8)
- z, Q  k  |4 o/ n8 M9 g8 i. H* \2 d
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' k8 q& j; Z7 J2 s! zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ L6 ~# c0 Z! I) m& k6 B' E$ ~5 |0 v, [) |, k+ b1 d: N, e# S
$ K! W6 d6 W( W- ~. v) F
static bool server_upp_data_recv(Server *server) ) S7 B1 F  j) C# j2 d& q' S& K
{
1 n3 e: k" a8 }    if(server->upp_channel_a_recv == false) {! ?3 W* b; {0 L# h
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; ?: [/ r) \( L8 e* c! `        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {% u! I$ Z6 q* \9 z
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 s8 N8 b4 b5 x# m/ V. g1 K% S. {; y+ Y& `

# ~$ `( m, r+ Q( [            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
2 A$ M/ n8 d: j! g. h2 `+ Y7 C% X, n3 j9 `! G3 V9 w
            server->upp_channel_a_recv = true;//
' r  p# V1 c. Y3 o            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);2 _2 j* g( ?" {$ a' J
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
2 ^4 |4 M* R" W" P! \2 ~& P" F            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
7 W# o) ~: a2 y' R9 z4 t% k            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 y/ u. p$ x+ ]9 M' H( N0 E2 y9 u- ?8 X
            upp_error_count = 0;4 V3 V- P) s+ ?
            upp_dmai_int_cut = 0;
' L3 i# B) l4 c+ i5 U, P5 R
% [9 `8 A7 r& L& j1 L            // fill in data # C: Z7 ]7 x* O  c% C% h# ?( M* d
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" |# b& ~) s1 g: [
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& l- N+ z: W$ N- `8 O- E7 y2 K  [        }5 Z/ \9 [( O+ K9 ]3 X" w/ d
    }
0 D# S4 n1 D6 B( Q! T! `    else{* v6 W- [+ ^" Y- z: Z6 Y" n# ~" `' Z. n! s
        if (upp_dmai_int_cut > 0){
( x6 u# {2 b. }6 L8 n            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
. [6 F, R1 v8 A            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' s5 C5 o1 u% U: J6 O- c3 M

' q1 G$ r/ ?4 `8 M' J1 W  E; k
% `& Q% Z( Y9 I% d% x6 S6 U            //copy data to upp_recv_list_busy
- H+ |2 x% V# Q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: g# D& C* w1 |3 Y

( ~6 S$ }; u! D. L* @; `' l            //2 R8 @) ^: {" h9 ?. B
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& l; i, Q1 H! k6 }- S$ y% B

# F9 d7 R  l. O* f) G* K5 s            //
  e" F! w* N- h" L* m            server->upp_channel_a_recv = false;//& }7 P, d) d! u+ |% w* Z
0 T+ a* p" _  ^) N6 G! h" ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
% R* K5 x1 s1 I( H7 F$ l        }
1 J2 Q* x6 ^$ q, F8 E2 @$ D* U    }
- l5 w3 ^' k, ?$ X# \2 z
" A; O8 z, c" I/ Z5 K+ U. _' |
  T( c( N: H& i/ n+ q    return true;
9 x* @2 d3 ?. ^! Q0 B}6 I4 ^( z; ?( ]( W- d* ]
& x" R1 j' N4 d/ ~( Z6 ?" w
static bool server_upp_data_send(Server *server), ?3 t- ~2 W1 Q( X- F" z$ K1 X# M; z% |
{! b) t6 [9 {) h  I5 G6 f; j
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
6 c; ^2 Y" j8 N" o$ K        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 C, F& S! u) O$ H5 r  U" b
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 e: k2 r) R/ ]" W        char tmp[128] ={0};
+ f$ F& O; O; q% o) K
: T2 H; R7 F4 B. P" x        server_msg_send(server, APP_CMD_LOG, "upp send: start");. a) k- a1 \: |7 p7 W  Q
        print_log(server, data, 64);
, n4 C1 v% ~; U4 h: J% W4 a5 f; h* `" V& S4 Y
        //, g+ N6 ?1 _! C, s# c
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' [& M  i- y$ T* J0 U        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
8 }$ m( V3 u0 e9 g5 [* q/ G7 m        print_log(server, upp_buffer_b, 64);
3 R# v, e) J% c: q
# t- T4 O8 s2 y& i; p2 R        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; N* |$ A" v5 P# O" N& H  \0 g; N# l
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 2 k1 V+ J4 N- ]( @! r$ P  E  O
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;  _4 V- o8 Z4 A( J; r9 b7 m4 w7 A" O
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/ `+ R3 f& y. J* W' E

! ?7 f8 L1 Q) _5 b+ d& h        memset(tmp, 0, sizeof(tmp));
4 E  n' e4 C8 M& y& m        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' E5 x, K( L  ?/ O& V& v5 e$ U
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);0 ^% b; }/ w) W3 _" X
        server_msg_send(server, APP_CMD_LOG, tmp);
/ i  K' G3 Q# n; B& U2 Q
/ W+ a, d6 O) Z: T3 A        upp_error_count = 0;
  ~  K! d" L% ^. ?* g1 J        upp_dmaq_int_cut = 0;
# L( a/ P0 Y4 b& p2 C# j! k        // fill in data
6 P# U- R  g! M3 M        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 P' O, {* s' Z" e; ]        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 x. V- H& U7 m/ F7 f2 h8 f: x

- L! }! v( I  x/ d6 D: E! X        // wait send success+ w# G9 {, ?: H( }+ i( a9 ^
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : b# d8 @( m; A" P# Z" B+ b0 U
6 f% A9 j" K5 G0 x- Q
        // make data node in free list 5 p+ g" [' J( {
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);1 `5 a  d* ?  P, _: ?/ R0 }* r
        server_msg_send(server, APP_CMD_LOG, "upp send: success");0 ~) b; J4 W1 Q7 N5 l
    }
1 A* L: L6 H+ c0 o4 f& X. t    return true;! m+ o5 y' T6 }& ?! E8 f
}3 {( N. e6 a9 ^, N$ D7 E  Y

! B7 k4 ~  |5 G

# |" n" v) m: Y  z
' S: Y- c1 Q" M; Y" s# c
, k; k3 \$ H7 x; c5 D

, D! P" T* ?) w5 ^

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
& }/ ?- [( M( b8 D: h* [* r8 e- \$ H# V9 W/ e" S* Q

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-11 05:31 , Processed in 0.040918 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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