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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / q4 A/ _! W# t3 m+ L7 x5 i

% ^- h& k2 s( \/ c, g问题描述:
1 C1 R: C+ g5 o2 E8 H& H7 j! v在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, L3 Y) M6 X5 z6 D" c/ t1 F' N' g7 }: J# f' |8 T1 {& M3 h& c
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" D- {4 H: ~- Y5 [6 k( p
7 ?+ d/ m* w+ d: R6 U
测试结果如下:& N' g. B* }  ]
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
7 L" |! z# y0 f3 ]
2 J4 A. ~$ b& j% \7 T0 P% t. Z& e. U) v+ e1 x: ~7 s
备注:
/ s1 ~1 K" Y8 B9 T, n4 a8 |" V( r1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?6 l& |" r( k& X
2、相关代码如下:
9 z, w0 C' @" u; @//UPP DMA缓冲大小512字节
7 [; k$ g' i4 X3 l5 A! [: O3 y$ \#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: t+ `0 M  n/ p9 E- H5 m& Q2 a
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; @0 p- O, U# u7 M#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" w% r* }8 g- g. ~% b* E0 t* B6 j+ i+ z( y* L6 b3 z

0 Y' d3 \2 m& o: M; y//upp接收、发送buffer# o# s8 V- L# S! I
#pragma DATA_ALIGN(upp_buffer_a, 8)9 M* p! X" x# D6 W0 I
#pragma DATA_ALIGN(upp_buffer_b, 8)/ U9 \2 Q) B0 ]- t0 }. b  {; u
6 `4 I; i4 T/ B( n" b
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 Z, J9 K9 K+ c  [/ H4 ~9 d: ]6 o3 J7 o
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" [% L) z9 N1 p4 i) w2 W
( g+ f- g/ R) |0 C
( c, ~" x+ [$ D; `
static bool server_upp_data_recv(Server *server)
6 \- L* k- z7 f' P{1 i5 n3 K, n! C9 ?8 R" `! s9 f
    if(server->upp_channel_a_recv == false) {9 a8 N' [# w  [  p7 ^
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 f/ G  X+ d; `0 S+ t
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# G: T0 y5 _) `
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");" t! h! O8 q) q% x; X
* f' q6 O( B6 w8 f9 f: C8 p
) C6 D) j: V- W3 C0 \% Q) g3 l1 }# v
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ Y! u" D6 \9 O# b
. J, }/ u- T# U5 R! N' ]8 h            server->upp_channel_a_recv = true;//
. T5 D8 B5 j. x$ R3 ?+ t8 o' a            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
& @; Z" ^" U5 p5 L9 j7 M& w$ F            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;$ V: [* e% X# C, ]
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
; q7 N' l. a! ^; |  U# N            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 R" [9 n/ A6 I

. G, t3 U' u+ @/ k) y) f% Q            upp_error_count = 0;
7 N( y" J' ?1 Q5 u            upp_dmai_int_cut = 0;
( G7 Z1 y! n; V, H2 \! J+ o1 h0 {7 m8 u- K% t  ?4 Z
            // fill in data ; K; d- g5 _& c! f# T
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* K1 b4 m8 q2 s+ [7 B' Q" ^            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 f, X1 ?1 s) G2 x
        }: Z7 e6 e* v! T) s
    }" b$ W0 }6 g1 ?" D) B
    else{
! g) i2 d- {( ^1 Y8 m' g$ |$ W        if (upp_dmai_int_cut > 0){
+ o2 [& W# j7 a! t6 ]            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& p) [3 N+ ]6 L, o' \4 x. z0 [
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- y4 `2 x6 K$ `9 x+ Z6 x: k
1 T8 z- w- C0 T$ k2 j4 \# a
1 q+ c7 p: a5 p2 Z7 e/ X: I  Z
            //copy data to upp_recv_list_busy
( r2 x2 z  i( {' S, Q: l            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
  e8 \, _4 b4 [& k& T# L( a6 H# Y9 {* }) B9 K( {
            //6 M$ D) [1 L8 `1 h
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; \; Z% \1 F2 q4 h

8 H8 k6 r" y* s, X) z            //
; q2 Z% I0 u# @; {; d  N3 S- v            server->upp_channel_a_recv = false;//
' `2 O' n" s. w
9 A. k6 m' I; e" H            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 Z; }' _0 r. c! O* W        }
6 {: t# E  J' }5 Z    }6 g& B- p3 T- G( m/ q! \

7 `  p6 k) [, M8 c
9 j& `& C' ^) @3 ]( K    return true;' w1 S2 b( i& Z7 Z
}
8 ~; J9 r8 W5 m6 }  W6 A$ w4 G" E
' g9 R0 k8 t5 Tstatic bool server_upp_data_send(Server *server)
; P5 U# K* r9 j1 t{) z7 {5 m+ t# ]7 }5 Y( k- J; f
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){$ `" r8 h+ b  X' p, [" I! j
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 `7 [- f' M- R7 q4 j1 E1 e
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 _$ w4 k$ \' l" T/ X/ ]2 v
        char tmp[128] ={0};1 B9 c, J! g) X7 O$ B% i+ Y- E
$ o1 _) B5 h: O. p8 ~9 A" W
        server_msg_send(server, APP_CMD_LOG, "upp send: start");# F1 O, g  A8 I9 j
        print_log(server, data, 64);
) V" |9 x- a. m- {& o8 l
! ^* A7 V( M4 f8 u        //! U8 ]4 ]% h5 U2 A, X) r
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
  V( }# {4 m, H. _" `4 s3 K        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
- I: O: I+ X8 c- S2 s) \        print_log(server, upp_buffer_b, 64);# G; q& q5 X" v5 `  M, |' @

, Q( ^! X& F8 T4 F) X( A5 I: j        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);7 ~6 e; F  r) e1 \  ]3 N* K8 _
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 9 w1 v( X9 s2 z- y' Z+ ^
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
- N$ w) R4 q- V: k( n        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 G3 g- O1 |& ^0 \0 R8 L* d  U# G: `
        memset(tmp, 0, sizeof(tmp));% m$ M/ f3 i* T; d9 P- Q' L
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " X. m" x; `7 j+ N+ f# z, H
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) w+ w1 B% |: w3 T8 k* w8 ^        server_msg_send(server, APP_CMD_LOG, tmp);
( H/ }8 b1 j! h6 A$ D, p" q8 Q. B
        upp_error_count = 0;
: N$ g8 Q+ i9 V. A+ M# T        upp_dmaq_int_cut = 0;
; x9 y9 t* |* I. i0 D        // fill in data # r" p3 g; i/ f
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # d0 k3 [+ ]8 J% f- V, Q0 T
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. q$ f$ T# h1 _5 K1 T
% c8 c3 S, j% k' e4 K; A        // wait send success
( ]5 t3 \$ B& R3 K" D  x% |        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ \, {; o- {! p
. i, L2 t  ?8 O4 X, g
        // make data node in free list
9 F/ D4 E# `- G- Z        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 H. h; j2 @9 ^5 y  Y$ c        server_msg_send(server, APP_CMD_LOG, "upp send: success");
% i# E$ j9 ~: F/ H    }
1 a0 `% H1 r  f0 G; u7 \, @    return true;2 F; V% h9 T* K
}4 B' z' r" }; `% V+ }

$ g4 g- d$ B6 ~' Q1 m

& g6 M  s  |6 c9 H; J6 q+ t2 \9 G5 {8 T: W8 a4 _1 I* Q) K; f( @
# L9 j4 P1 X# }

! d$ ^; A3 n# r1 ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐4 h/ K# E! D* \) ?4 c& o

) l0 `. y* \( a: p

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 18:03 , Processed in 0.040016 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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