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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 d9 q- q2 o2 w3 [/ s- E  u/ d7 K
. O7 O! e1 h: o# ^8 H8 N2 }( [问题描述:
5 o* Y  H) _' g5 U2 O6 Z$ h" L: F在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( _' c' r2 n1 y

2 r: R. `: r/ E- h图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 o7 }2 v% B4 r4 N6 t: g" h
- `* `8 c) H2 y8 B4 r+ n+ z测试结果如下:8 g; A7 T/ Z+ f* ?& b
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  L  A" h2 E( |- }
5 F, K2 v/ U2 ?

/ O- j# b- d3 s4 B) g( M+ O, O3 Y( G备注:: s8 [  Q+ ]/ i2 C- m) \
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ g. Q' S( ~+ K7 u+ Y& L
2、相关代码如下:/ A* B7 G7 K0 b! q/ I% ]
//UPP DMA缓冲大小512字节
+ Q. f: S3 u0 p9 B) M& H1 u* D( u#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' B* L% D. J( p( }' j8 m
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' X% I0 N1 J+ c* G: T#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
  }- h) K1 M. m: S$ W9 O5 b* H2 F- \& d9 p9 A
' _; _4 G) ^4 c" _) B1 Y* J3 R
//upp接收、发送buffer
' q' |9 p4 r3 O' W9 |/ j7 }#pragma DATA_ALIGN(upp_buffer_a, 8)& A0 o2 K1 Y3 e
#pragma DATA_ALIGN(upp_buffer_b, 8)8 Z" ]) H% u/ i8 L

1 q. k- F9 m+ I- N- }) d) dunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 w  o3 J. ^; v6 gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
' Z! u) N' i* G; k& P" X/ Y
/ ]) A. C. f% \- M, O
2 J1 u. k. @$ Astatic bool server_upp_data_recv(Server *server) 4 a& _3 z9 w8 X2 ~$ N5 k# Y7 n- n
{
0 C) Q$ R( I, Y: [. Y' x0 f( c    if(server->upp_channel_a_recv == false) {
$ R' ~/ C9 a6 S& b9 m        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& _/ X0 H1 Y! ~, K/ M: ?5 U# r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% A: m6 T7 m3 [4 E& m# `% o. B, o" S            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ Z; \1 ]9 ?. K; `; L
& u! c' J1 @0 w. j( e6 _
+ |) O# a$ J' M
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& G: W2 j9 S  _. ?! j% M2 M8 w8 Q3 C+ V) J$ S  X
            server->upp_channel_a_recv = true;//( `% l; P3 @/ D' c& I, N% z
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
2 C( n" I6 _  W1 L1 A            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 i  R+ I. x) r
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;& }1 h" n* u: [+ V+ M) ~( o4 b
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
  B2 t% k5 S# q: _/ g$ X3 |9 `* Y
: j) y5 G5 x5 F            upp_error_count = 0;; e* r+ O$ ?; B% z3 Z
            upp_dmai_int_cut = 0;, ?+ w$ u  |% ^" ?0 F4 p  K
7 Z$ Z3 a$ e$ i) w: V) N2 l
            // fill in data ! y. W4 I" c6 Y% o2 S
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' s! s* z" o; [+ I% x6 W, }  s            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: a) |) O. V/ f$ R4 s/ M        }
% \9 U0 L8 k: m    }
" E7 X. g) l# E4 H) e    else{" x# j, E& b1 w. j( Q( n4 E' P: n
        if (upp_dmai_int_cut > 0){
7 y7 n4 X. v% I9 ?& C# G% O8 I            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 A7 t7 b" x5 ?5 @4 Z            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ M9 N# v" e8 V& O/ @( d1 \5 Q' u9 Q% q+ A' F2 x( ?) r9 T

3 _0 e- D; o+ s$ |5 @5 B, [            //copy data to upp_recv_list_busy
2 e5 k4 T0 g' S) i/ {            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);; a% `( U: I: j. c) q- p/ t3 p
( S$ @7 d) r: a( M  I
            //+ b3 g8 Y4 h4 Z* M9 [
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ k& N& h/ ^' E& A

7 |% ]; \4 ]8 |            //+ E5 o2 F, U/ H: ~: b
            server->upp_channel_a_recv = false;//
- b4 R+ \3 [- J! z- U
; Z/ e0 X* L; c# ^            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ G) G0 Y% z. G+ B        }" I" s, A: y" }) u* @) J
    }
) L  `. q  D+ g
; u/ B; [2 I* Q; l% c6 l8 y: b* D
1 ~; H2 F0 _" I/ n; t    return true;
7 t. i* D5 c) k3 n/ S+ ?: V' g}: z' T# d* |) E( ]1 L* p8 V8 ~

& K# s' m1 O  r' c8 b% x! D! T6 Nstatic bool server_upp_data_send(Server *server)  j( A, N4 a8 t! S( e  J
{
$ f  n& E! C& Z; U" ~2 h9 o    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 ]) `: {& u/ g8 H8 Z9 {        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);1 M" V5 k* Q. k
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 o! k& Q) s: Y/ @; H
        char tmp[128] ={0};# O6 V& {- _3 W+ l2 x

" m; e& c4 i1 t! X* m: m        server_msg_send(server, APP_CMD_LOG, "upp send: start");7 q; o- V) d7 r4 m2 t
        print_log(server, data, 64);
. |$ ]9 o" `( Z" |2 ]7 t  ^6 q. s! |2 n7 j8 t
        //
( b% p5 ?: [" h, T+ n        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);4 G" W: {* B, j# j% A
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  o' ?" W) h- |! P2 \& `+ `
        print_log(server, upp_buffer_b, 64);( n: f- t8 ^/ o9 @  w
' X2 {* C2 M+ v0 @( P8 L
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; g7 b( o- p+ g+ X( C6 U! b$ b- _0 ]! ^
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; $ a. Y7 D( |, g& [9 E6 u
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
9 T- K1 x! M: x6 I: d# j        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 }1 [" Q$ Y* E; ^8 n( O3 m) `9 s9 u8 {
        memset(tmp, 0, sizeof(tmp));1 p8 \1 I: [6 t" g1 I
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", % y6 C5 O" n5 ^$ c2 Z
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& p) t0 a- ?, S
        server_msg_send(server, APP_CMD_LOG, tmp);2 R3 v$ n* T/ a  v
4 B- y. s5 t# R
        upp_error_count = 0;
. t9 l2 A* ~+ E7 M        upp_dmaq_int_cut = 0;
: ?/ Z3 B* B4 @# D        // fill in data
; _2 z% ?2 G* s9 F  s        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) ]8 T) G% `+ e! a
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 a5 q( e& ^1 ^9 v$ n1 o, q. g3 R; r$ l2 y0 X5 U
        // wait send success
- k- a) ^& A+ s5 {3 m2 z0 U        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 _# V4 \5 w6 q( s$ \, Q8 n

' C7 ^; q) v* t" g3 }        // make data node in free list
, D$ M/ S7 m( |8 K4 O        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 B6 A& L) Z$ D, J8 j( [        server_msg_send(server, APP_CMD_LOG, "upp send: success");4 Q$ v6 O) S. x6 y
    }
9 m! t* o  y. x( r! I) c    return true;- [# I, L5 G7 F0 g- f3 O, p2 ]
}
) e. S% c' u/ n7 r& Y* X
' }6 G) ~9 F" x3 l/ y+ ]

1 N. b1 R& K- Y$ {6 r4 Q
3 ~5 q8 h, a/ T/ F, c

8 C. ]' l1 L' p5 x1 `9 b- M
. y1 Y9 Y$ V1 m$ t% L9 u' R6 x

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 x6 H" Y, P% n0 E( l: Z/ b
( l/ e7 }3 O; |& a- k4 ^

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 15:00 , Processed in 0.042462 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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