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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ D, ~1 b1 u, N) W8 V  h7 b" D6 \4 `8 K$ M6 y2 N' o
问题描述:
; r, R, [8 d* j) J0 H9 O: `$ U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* _& Q# d+ C# {4 P: d. b4 I% `, {8 a5 R; h7 H4 r
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。: I9 d2 ]" ]! D/ ~
  u2 c, |7 U$ H/ V0 k
测试结果如下:4 o- d* D; {. `0 v& r9 \
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?2 n# x9 l( c, I0 k: i
! \5 _8 v5 {: a4 w- ~6 P* p
* q# S6 C0 R6 T; E8 R; _. X# V1 p
备注:
& Y: m) L- z) y- X8 o  Q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?5 L, D) p1 P6 w) W! P# o6 a8 Y
2、相关代码如下:9 e2 I; f$ n) o  u: Y( d" l
//UPP DMA缓冲大小512字节! q3 ^% B. ?( [+ C0 X
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 ?; [2 A, j  w7 V2 h
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT) Z) B  k! U9 X8 H
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ T& g) @! o8 p! X2 M
# N/ b+ v6 y2 o4 n% R
; C! [  \' h$ f, N6 P" D0 f. e" ~
//upp接收、发送buffer* _( c( B$ R7 C* Q
#pragma DATA_ALIGN(upp_buffer_a, 8)
4 S# g+ @* _6 k1 ?7 Z#pragma DATA_ALIGN(upp_buffer_b, 8)9 b8 E6 x/ P6 E. R8 Z3 A9 F

; e$ M: Z9 F# ]unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' W3 s( V' a5 ^7 y0 g. c+ ?9 C1 T
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];2 d' q5 U; t) Z$ e* a) ~! ]# e
1 r) I- Y5 K2 i) v( ]

% j2 ?9 l' W5 Q! g1 i( L$ W# Xstatic bool server_upp_data_recv(Server *server)
9 [" m; q; y: W8 b{; I/ J. y; ]  C7 r0 j: f
    if(server->upp_channel_a_recv == false) {7 F8 h  S, J+ s9 A
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: m; W* M- n/ C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {" p  U4 F' h3 m$ {6 ~8 G5 O& ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 z, c+ T6 f" W% C
( r( P1 ?; x: ~5 Y2 h% {3 D

, E3 F7 N7 i8 v9 K0 Z3 t            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 A+ w: n' F4 {  d

" U/ Q! o3 t: f# J0 j: j            server->upp_channel_a_recv = true;//4 l/ u& R1 [4 C) U( n5 D
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);$ T- Z8 a& H6 F5 O: a. W) Z, R
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ z5 f) e/ ?& _. J  X! a3 q, q- y            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! p- r% M0 |. T" Z: m! j6 ?            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) n% }% \4 S) w
" o( A: J$ P8 ?
            upp_error_count = 0;
( q; q9 Z3 `6 _+ H  L; M# \            upp_dmai_int_cut = 0;
2 ~$ W0 g  p$ M; Y3 O) v  {: {0 y2 X; b/ `: o4 q/ w- S/ a: y* q( ]
            // fill in data . y. f4 ]' R; ?8 P
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  i4 ^( s' l' s4 e: M0 T
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, y- Z& u* D6 H! _
        }
& z* l0 {4 x$ h; B% q    }
+ N; `3 `( i7 Q. }+ Q, d    else{( T" w/ @; q! w. l! ]0 A+ J) K/ X% u
        if (upp_dmai_int_cut > 0){
( b& C$ G) b# s6 [% b            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% B% R' Y, n- ?$ S. E# I! D
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& ~  h5 u' `. X2 T; j4 O
2 E$ I# z+ Q# F& R' j! ~" u& _8 u9 }4 E, j4 T. z( O: a5 L
            //copy data to upp_recv_list_busy* T# t1 [" M# D# M: f
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. p7 j- b) o) j0 g

( s; ]: J1 J$ F( W! k8 R% U            //
% X  G: _0 I5 b) j$ T            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& F9 L. f6 |, E# |2 e. B) }: ^9 Y, r+ v  o
            //. U2 {0 }7 T) B0 L, m
            server->upp_channel_a_recv = false;//
$ w9 f# Y& J: |% }2 z( L. [2 D  U8 T/ M' w
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");4 ]/ i: P8 ?5 N1 S) R9 ?% M
        }3 j' N# g8 U$ d4 L& F
    }2 L1 @4 l6 d6 O9 x9 }% Y# o

! m! H0 b( o$ ^9 W
" K8 ?$ [. C+ ~7 V: Y) }4 `    return true;
/ {9 a; x- a( l) E}7 O  k. ^; t* x$ r7 ~; I
$ I  _0 q$ n5 K2 ?3 q+ J
static bool server_upp_data_send(Server *server)
( D* e9 h2 J$ |$ ]{
. y' F) X0 A, w2 c7 R/ A2 |3 M3 V    if(ListMP_empty(server->upp_send_list_busy) == FALSE){& j% u' e% J3 m* O/ {. }
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
+ ?/ `6 E! t; e9 G  p* D: S        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
9 v+ ]* }2 d$ E' `7 f        char tmp[128] ={0};
; F1 e( ^, @% ]3 b3 ?% ?3 L. v% Z1 ~( w4 h1 @' _, ?, F1 L
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
* ^6 j' g4 r' v% e, T. j. p  `        print_log(server, data, 64);
$ t8 \9 L* U% {: V! O- [8 M! N: b( E* N, q+ d5 G$ [: x# y" T
        //
) b$ e4 d2 ]8 e+ D0 m) u9 N$ x        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; B/ g( F& E. C* z# k9 j        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: m6 q  M2 w0 ]# E( \9 V        print_log(server, upp_buffer_b, 64);3 r9 h3 U' Q% x4 {6 _' n
* _% ], l2 O- D, e8 f' n) W
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
* B$ k6 I4 @' ]0 z        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
( c+ e: N1 [' ]& J; q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
7 Q0 E% }. J! X, j6 v' I        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 D% x0 o9 Y* x7 r) ?, F/ f% v
" l, }' `7 ]- \3 a7 V7 _5 C% l+ o
        memset(tmp, 0, sizeof(tmp));
" I* [9 ]0 r8 g' M        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- y8 ~# H# U* o2 S8 O% V            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ d4 Q) ^/ n, ~
        server_msg_send(server, APP_CMD_LOG, tmp);
3 J4 N; x6 o- p' w2 |+ D) x
7 F! K4 K6 b2 |6 ]2 ?        upp_error_count = 0;
$ E5 T4 }8 t% d  l! A        upp_dmaq_int_cut = 0;
: }9 N2 q( F$ O8 k- J        // fill in data
0 A4 d5 k4 q' ?& l        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 e" T* F- W! G/ B" ?: }        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) V4 a/ I* O' \4 u* ?; T. b" M' R8 ?1 F  Z
        // wait send success  M/ K2 r$ i% p. ~0 H& O% `
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 Z) q4 p9 Y  O7 s
9 c/ p% e- `8 {, ^# ]3 N$ ~
        // make data node in free list 7 q0 X' h- m  V: u1 W; V6 V# z
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 V& }; J, n; w% B$ u        server_msg_send(server, APP_CMD_LOG, "upp send: success");
$ h# X! C$ ~, E. t    }6 O3 z) q' V& @* c
    return true;3 `; o3 S% a% x) c* j; g( Q
}
+ H% p- H: h2 _8 N
: B/ D0 A( [- n  r: i! J
) K) N$ o3 d' a1 P3 q( {1 V

; v0 o. x* h/ C$ e# z) Z
* r' T3 b! A! W6 ?" b3 m8 \, T

5 ~) d* D# O" n, {; ^, m

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
! l; i6 S7 o1 [; `1 d; r# Q( {9 [( T9 f5 O: k( e- O: K

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 09:37 , Processed in 0.040618 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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