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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - y6 v0 U' Z& H  N
7 y$ F! D% C4 w# o) X# f
问题描述:
/ |$ k7 X$ F) V4 s" a6 P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, D, C/ b9 Y  V5 @) F4 ~9 J4 M
# ^0 l' i* F1 t3 C+ @$ u图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。+ g/ A, r6 a( l! |4 T
$ o( Y: S- T4 B1 x4 U, G
测试结果如下:/ y' F) n: J# c$ N9 }
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  q" N8 Y4 \* }1 t, \

( b  A  ~1 V3 h4 `) }4 k" o, j! Z, ]2 L4 T
备注:( K( C* ]! S( _7 U! ^" g0 r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
. Z! Q2 O+ {( {9 ]$ ~+ t' y$ y# L1 o
2、相关代码如下:
5 }6 u2 u, ~8 N$ k4 v) }, E  ~) R//UPP DMA缓冲大小512字节
. d( F+ `9 ~1 T- i! K/ k* |/ p#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 o$ B- g# Q) `; C* J! m: f+ @1 x0 X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: v6 T9 r; D, P( F! U
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( `4 [) J; l6 {0 w7 J
* h; i$ m6 ~4 E) Q* B2 q5 J+ b
; L$ {2 W9 V& [6 @( N3 Q  S' U
//upp接收、发送buffer$ T0 I4 C4 E8 G0 u# [/ U
#pragma DATA_ALIGN(upp_buffer_a, 8)9 _8 \# V+ J- b+ n+ O; c( O
#pragma DATA_ALIGN(upp_buffer_b, 8)
$ n; d+ L6 B# {" T, f
+ j1 ?5 \+ a# b1 Y; A$ H2 P% munsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
# r% n1 K7 x2 Q3 |8 ^; dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, p: ]4 I" N& N) Y) B( @
. z# [$ G/ k' }( Z" h9 K
" c; I; I7 ~/ L: q1 x2 h3 r- e
static bool server_upp_data_recv(Server *server)
2 Z6 K9 q  Y: g. \9 F, T{- a* W0 R, n% c% V& h. Q9 B( E  y
    if(server->upp_channel_a_recv == false) {
" L$ c( L8 z1 \+ E5 y  F        server_msg_send(server, APP_CMD_LOG, "upp recv: start");- E# V+ _! f* o" I5 `+ b
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 l; o) W7 ]$ @, ?; u2 F
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
. A% V# ~) M5 U( G6 c/ S8 |
) ]7 O% e1 Z. q
# y) K; q- w! Z; l# l/ ^            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* x: v3 ~1 Z, ~0 {9 Y" t
/ u9 A0 D7 `# u6 p% D6 J            server->upp_channel_a_recv = true;//- p& D! |& r1 o6 N
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* w+ u# ]8 }; F0 ~7 {5 L- r) T
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
' q( j9 B# N! o$ Y% `            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
$ @" Y1 e, W9 M8 w" C' C( k            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ Y4 e- V/ x; Y! o# F) s9 G* ~

% |6 ^# J' M; I( b* F; i            upp_error_count = 0;
  p+ _) ]$ v) W  |2 M1 {6 ^  J2 a            upp_dmai_int_cut = 0;
/ x. F" u9 A( L$ `$ a5 C5 h9 E9 H( f0 Q* R, f4 a
            // fill in data # O$ o/ K) j+ ]7 H# J% e, `7 x/ [
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 `: d; Y8 i) z) S) n            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: h" z  S% s& c: ?  Q) o        }8 |, K6 {; h5 q& w4 }
    }
) s- M: C# t# D1 A$ t, ?    else{
) [3 m8 _6 [9 \. F( e) n2 `        if (upp_dmai_int_cut > 0){! s1 w. q7 Z6 o
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 B- Q1 Q4 g% v# [& |& V+ n, {) A            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' Z+ E9 G. \1 ?& [( @0 i: l3 h. ]

5 e4 l, z0 Z0 f1 Q
: Y4 M/ ?: I' f( s. W            //copy data to upp_recv_list_busy
, Q) g9 ~; k- `; R9 @            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);5 G- u1 ^0 m/ n) ]
! o# e0 K1 h# ^+ n
            //
0 T0 f; W( H8 M, |# {# i            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 W% k+ }& p* p" W. y& M7 S
1 z9 S5 ~, S. g' J3 x
            //
- y2 l# w& K/ c$ I6 o' }            server->upp_channel_a_recv = false;//
' g; U. J, V) S/ E, k
% c) Y7 |% Q0 M            server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 }$ i( W: ~' i7 ?+ J
        }
% g2 u9 E" t1 `) D! S1 ]    }
2 U# o/ V$ h9 T7 _- S3 `+ _5 \
  c9 B$ c1 Y$ u3 F1 `+ h2 [' Z6 _5 E: G$ o
    return true;
; {) a" m+ }4 o8 Z}/ O: F( ?- {! \

* J2 r+ {& B4 Ostatic bool server_upp_data_send(Server *server)
( I/ d. w  B" }{
; i/ E% l* D" z    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
$ v2 r! k6 p' @6 V2 P        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ }: w9 C( G# V8 L: \" v2 j
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 K6 k9 K4 e! l' Z; y
        char tmp[128] ={0};- V0 @! v/ @+ k$ j1 f

1 V9 B9 S/ S9 q" d1 P# _        server_msg_send(server, APP_CMD_LOG, "upp send: start");( W! j  U7 ~8 m6 l. j; x
        print_log(server, data, 64);5 w, ?9 R3 Z$ n6 U

9 }/ t( Q# n0 d$ z6 E        //
) K" D7 B2 Y/ i8 I+ w9 D% e5 A        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" W7 d/ i1 H2 Z& I
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 n# g& k7 M1 K- U
        print_log(server, upp_buffer_b, 64);
2 l6 v. q4 b5 ]5 C! B- ]' C' R' j% n9 F) v/ h2 p- V  B! i
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 X5 Q9 z0 h! \& P; \, O/ b        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; * `2 }; M! c9 L6 V8 e/ ]
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;0 \/ u- n+ i& I; u  u
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
: N: e% q. b* d9 Q* [
. y8 i0 ^) r# ^$ _. R        memset(tmp, 0, sizeof(tmp));$ n4 S! w; n% ]* f$ L
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ E, t  A: R2 S4 R$ C: ~+ H" \
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 r  ~9 P* n% |. I/ K$ g
        server_msg_send(server, APP_CMD_LOG, tmp);
) Y" w. F; ~$ |1 R. j. z' `& ]: [! f* p9 |. i3 B
        upp_error_count = 0;1 a' u; q  R, ^- ~# @  w. p
        upp_dmaq_int_cut = 0;
  l) ~! L. v, w( J# S: J2 z        // fill in data
, \1 I. V6 h7 V9 @        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( X8 ?! {1 L/ Z5 F% S+ C
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) ~, E# r; Y5 l! ?4 L. |3 h4 Q- D/ v0 U/ `* V; N' e& Y/ d8 h
        // wait send success
$ S6 z2 E* B5 \1 h: T1 B3 k        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 M% w8 q# ?& s& i
" Y  v# [- l" f0 d+ I  E
        // make data node in free list
1 f5 C# Q) q, E* T        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 q9 B# e7 @$ z2 e0 N* L7 d  X8 ~# _        server_msg_send(server, APP_CMD_LOG, "upp send: success");- j. Y5 |. I; V* }9 D- E. ?
    }; ]1 A6 X5 P- @' x
    return true;
7 x6 k: }4 U1 i" ~/ T( o5 L}
' d9 [: Y( ^- E
, r. E- O7 _3 E

- z& Z8 E2 X% s7 i4 t9 {$ J/ b  @6 k9 S/ V- V

6 p7 C8 }6 G  H& f7 O
+ W% J$ F  W# {4 k; F$ r

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐/ B3 C. g. U9 p8 B
) k& C# M8 O3 w& l, S

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-17 14:02 , Processed in 0.066480 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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