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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 % ~5 I+ F' ^) F! b0 Y

6 e! q' b. l4 C, X" T问题描述:
5 [' r3 e' S* H) L在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 i7 U9 q2 L% v5 O
8 n3 ^) g: i# Q  z: s. e% K图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* @, E0 z  A9 }# c  }8 |
5 A+ @  `& M6 y2 M. `8 a; t测试结果如下:0 o* I: X; |( f  V! L+ A8 f6 }
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?/ b' P. E1 E( a: q; k! t

; @  f$ g9 s. n6 E7 f% O, Q) ]0 w; ?2 l1 x, ^
备注:
! S  A1 _. D4 ?# G% T2 |' o( Z1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' O9 G/ p4 ^5 J5 M& T
2、相关代码如下:
! _$ |( j1 l* }# k* P5 {, b//UPP DMA缓冲大小512字节  _( b! `  n8 q9 E1 Q0 k, T5 [
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( O4 J2 Q& C7 f6 Q. F3 a, ~7 V
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT6 w) c3 l$ V; j" n" A
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)1 a4 f( P% a& j, M" F. R" x% O
4 c. [  V6 V$ H: V; b% k7 a* J3 u
" O* q! h- w. Q' A, }9 u
//upp接收、发送buffer1 @3 q. t% a2 R( Q
#pragma DATA_ALIGN(upp_buffer_a, 8)' z$ v, A" I" E! M
#pragma DATA_ALIGN(upp_buffer_b, 8)9 R" f* L& e6 c" W: ]
9 y- }& R* Z, p& q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];( A/ r: T! s7 p, p) X
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  P* ?5 }, m: p) _) g( l
6 t. {, z9 f& W7 z$ @% q

( _0 {' P" V' x9 ^static bool server_upp_data_recv(Server *server)
0 [$ o! b4 d& B* H2 p( a/ i% B! ^" X{; j( {/ B0 U+ h. r" ^* |
    if(server->upp_channel_a_recv == false) {
$ l+ T$ h9 ], I; X6 L8 Q, k        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' L4 W6 d' z9 C) w  L2 p        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% G& R. `! c6 t) O, C3 f' s            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; o: B0 q3 y" N, C- X
- X7 ~: n; S) `3 R  b' }, a) `4 P+ t% O8 l9 v) ]% T
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* D1 D7 E% N* [; r

2 B& b7 v$ ~) _  ^            server->upp_channel_a_recv = true;//
) h6 b2 \$ r8 K5 I" \5 Q            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);8 N! x, z& q! E
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ m9 Y8 i# Y. ]) f$ S# r' U            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;1 r. Z4 o# G0 G- i% i7 J
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ m+ t$ C. Y9 B) Z
  `' z+ K, w2 `2 J0 m1 {: x            upp_error_count = 0;& n% F8 ~( K# q9 Q8 e/ E
            upp_dmai_int_cut = 0;
4 V, h( |. r: A+ s( U$ S; Y; k4 F$ X3 |' Z# H8 ~8 H1 J
            // fill in data
' ?8 Q3 e7 q8 i. l/ H- D: ^4 r            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);2 g( l# P* h5 @, @, l7 B
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* y' O) D& S, h; V$ k) L
        }% J8 P# ~  r9 @, f
    }
3 [3 Q% X) z% M/ W) a    else{
; J0 p$ I9 B& }/ x8 i! }, s. B# f. r        if (upp_dmai_int_cut > 0){/ E% W' v/ T% @* h2 u
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);! n+ X# X" z' S2 @9 E) {
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);) A0 ?/ J) i4 }2 d! C  p
3 z2 z: V7 m! o* V* e4 c  L4 [
3 x8 q+ e( F0 Q0 i+ p7 X1 x
            //copy data to upp_recv_list_busy+ w! u  `+ K5 o7 T$ p& w  v( u
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 @( `; |5 N- r# B) R4 ^: O4 \# ]1 v
            //3 S! T- I8 V9 K& b
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 l5 B5 g$ O7 q; K. p# h2 j3 }' g4 \. N8 E3 p. g  J
            //0 o9 v/ e! L2 k: F
            server->upp_channel_a_recv = false;//
: X, q" M( p3 _9 j7 z
0 g3 {9 W, w$ U5 _/ ?1 r- \            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 J. B& H1 C# O        }6 N+ J: t! j( K+ \5 Z
    }
4 s! _. v3 q; Z/ K& D" ]* E% _4 k+ i3 Q
9 W' R! |1 B6 m. E
    return true;
! ^  N4 U8 b; \; I& ~}
* S7 A" ]. T! U% U; o1 |* |$ d% i. i3 n! h
static bool server_upp_data_send(Server *server)% W7 S) ^% I1 u3 h
{
/ M, y: |# J% m) W6 L$ m! Z, }    if(ListMP_empty(server->upp_send_list_busy) == FALSE){  d: a: j6 }& O" [6 c9 S  x) T( o
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
% k& @! m7 \8 H- @! B6 W1 M2 z        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);; n9 V2 m! {3 @: t; f% l% w
        char tmp[128] ={0};7 [! D" V/ u2 i* q3 Y8 ^
* l& H% q5 v, y6 s! H6 e' T
        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 g& o- e/ o7 b% l- Q
        print_log(server, data, 64);
) l* a+ v2 s. t/ V, L" k7 L, [- L! ]" c4 K/ Z5 M8 \
        //8 u% V8 d, S$ f  A  o
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. `6 ~1 l1 ?  P; h
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 k9 V0 n, D. [" H# F
        print_log(server, upp_buffer_b, 64);- T1 _9 p" F' M- R% y- o
! p, i- b2 {% W& D) d
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);+ K9 B. ~7 R  T, A% h0 |
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
& [; C9 i6 A' X& c+ J- z        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;* t4 i( S% W8 t5 E
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% v2 l* a) p% Y, j: k  S5 S; W4 M+ k: u9 }. A) z, k% Z0 E* G
        memset(tmp, 0, sizeof(tmp));) ^# A+ a- n& }- b2 s# I& v
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( r2 Q" s7 L5 h$ e& _' l$ D; c            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' o) ?/ U- y3 g1 H) V% d+ r        server_msg_send(server, APP_CMD_LOG, tmp);
: d" y, M( B1 O% V% S# Q; Z4 W) T7 f3 C
        upp_error_count = 0;
( q; H4 N1 O( x4 n2 m4 B" s! f        upp_dmaq_int_cut = 0;+ P8 m  i5 @! r+ q
        // fill in data
2 @$ L# d2 S  W9 D9 o, d        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 D! X* m7 J/ @# @. _
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 ^+ p* u# z9 `% k

" [& {9 ]/ D( I3 Z9 n        // wait send success. ]! L% k; P* D' I5 s( R  y; H' W
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 `0 h( Z4 p: }. G) i% }, I
& c. V. U, ^; i+ j% \* H
        // make data node in free list * Y% Y  s/ s" ^/ H
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
- _7 G. @' b( }+ S: D( }        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 k7 ~  y0 C- u! g1 p, A5 W0 \
    }
6 H/ U* q  @; A/ O( U    return true;' \& A5 @! f8 `# B. U" e
}
& V' C% u1 r# z% D" Q, ~
- i+ w$ b- B5 w. h
, g7 y. x8 q, F2 i
. C- D0 @! a0 s" w& [. A9 Q. K) a5 V

1 y! }/ j+ j* h2 u" b$ c2 L& w0 ^: ~. g, \5 S- D5 p" v) P' a

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
" e5 }: ~0 z; [0 _( g6 g
" k2 h0 x# |8 c# J

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-13 23:21 , Processed in 0.041822 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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