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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 $ E7 N7 R0 @5 g  i; k6 C) i! ]
5 {, ]! }" W$ A1 c/ k9 a! y
问题描述:
7 n1 p( n9 q" T在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 }: `4 |9 n0 [
3 K6 q( O1 U; \7 `  b- x7 V% H: O图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 }8 F3 C1 X: p' b: g( U
1 G2 V1 u* V" l. A3 j0 o
测试结果如下:0 z& S6 I3 M5 w5 w' a
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 x- Y8 A* X0 d) D" {3 M- [
3 v. t7 T+ }  A5 H# K( u

" }5 J: F: J  {3 `  N6 P( o& Q备注:* P+ Y8 b: O2 ?
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) ]8 d1 f5 p' D# h) B
2、相关代码如下:
8 z4 @& C7 W  W) y/ X: k//UPP DMA缓冲大小512字节8 X( P, ]$ ~( g( v* A6 ^! ]% _3 R* G
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 f0 n# Z% u7 P: ^4 ^+ X5 N- p#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
+ c5 ~5 W& m; l" @5 n#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" o0 T0 t% v  g
. a+ ~# G. }- B( p! M; b2 z( N6 @/ f& D9 ?9 e7 ^0 @
//upp接收、发送buffer* t. |$ h" l  l/ u
#pragma DATA_ALIGN(upp_buffer_a, 8)
, V2 Z( Q0 N% f$ X* Q2 d#pragma DATA_ALIGN(upp_buffer_b, 8)/ T, k- c" V+ V9 L
6 o+ f# f1 R, I& o/ _, X
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 {# u  ~* H; ~- C  x; n) x+ E5 y
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ m6 z# f4 y4 p' J/ V( [

3 w: T  l! O7 W7 c, j3 p7 e$ y
$ c+ F5 t0 b  K( Z+ v$ [2 K# Istatic bool server_upp_data_recv(Server *server) 9 x3 y; p# Q; S% p
{
3 M2 [% U& ]2 b# ]% S! S7 b% ^0 l5 e    if(server->upp_channel_a_recv == false) {
( ^5 V/ Q, S" ~8 x4 `) {0 j- ^        server_msg_send(server, APP_CMD_LOG, "upp recv: start");" W1 W- w4 X9 D2 e% k, ?6 f, V
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: `3 w7 a9 Q! T4 M
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 g" j- A# _; X2 f2 n7 D% d( d# G8 e% z

4 \8 k9 W, Y+ A  w5 r# ~' V            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 H9 K2 P5 D  B8 o* y% y; X, K5 E( M- X& n1 ~
            server->upp_channel_a_recv = true;//7 S2 Y3 F& L. R' V) P3 x: ?# _1 D
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
) O, |) P" a1 a. y/ o  C            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
* z% N; e# E, |% U7 ]) A  L  [            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
4 S2 u' x7 }, f5 L/ A' b$ R            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 ], w+ p) J! x6 z/ L+ P0 q0 v* P0 l! Z8 e0 M. I
            upp_error_count = 0;2 i5 L  z1 g- X3 }# W% r# O- s
            upp_dmai_int_cut = 0;
; h1 F* o7 f3 `4 j5 N* t+ T7 z# s5 T* d
            // fill in data
* a& e- i- c9 j- y6 M            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ X" Z9 D! a& p; K+ k2 V8 c
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 g6 {+ S7 r; }: B        }! B9 `: _$ ^/ ?0 R0 S" U/ ^5 D
    }; ~" V+ R7 X6 ]$ R
    else{$ _! ?0 T* [0 X
        if (upp_dmai_int_cut > 0){6 `0 q! K- d, ]5 ^3 U# h7 @
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% I7 j7 T+ ~. g            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% I( \; _4 `5 M2 F
; s, G( _3 l1 x% F5 V

/ k, x) m: |) E8 y% m+ k            //copy data to upp_recv_list_busy! m0 _0 y5 k. y$ m( F; i
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);. ^, C) Y2 x  ^' h. @, g
5 l4 k8 m) z$ u
            //
! q& r# [$ Z; N6 [' G            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 ]" e! a* q  x/ ~1 X9 ~1 R  O, ]( X" p! U( w) M
            //
6 C1 T, G6 |4 Y5 z            server->upp_channel_a_recv = false;//
- Q0 Y) d6 x; D. v1 l' n& u
3 s' K0 u$ Q( f8 P3 m# u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: A) C: Y8 ], S5 Y1 b5 f        }
2 R: Z  v! Q2 D    }
, k2 V3 {1 D  L
2 C+ ]0 X3 e3 q2 J* O7 g1 j: A$ L; x0 m3 b1 y! O/ G5 \; g
    return true;
  C: S& m5 B4 x& B6 a}+ {: C# ^2 T* |* O, H: D
8 s/ ~8 ]) g  M+ M
static bool server_upp_data_send(Server *server)7 t& t& a( C. _4 m; b: x
{- Q/ Q; ]1 D) G+ }# ^) [+ G, l1 A
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 F, M* g- o/ i/ q& I( ?% Z        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
: m0 V  ~# U3 L* [. m: R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 m) d) T) ^3 {6 P/ o8 z
        char tmp[128] ={0};% x" g3 W+ e, h& }# g3 S2 U$ F

5 o. w3 V. l4 G% l+ W2 P        server_msg_send(server, APP_CMD_LOG, "upp send: start");
/ u3 k- G6 O$ N' p. C4 ~        print_log(server, data, 64);. l; c) V5 K( H1 o* Q& }; N# M7 C
4 R- e+ p( p) C
        //
  R, H; `& m5 N        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- d" [! L, V& Z: T) H
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 z: Z, J2 ~6 t- |1 ?
        print_log(server, upp_buffer_b, 64);) g8 H2 M, ~' y) O( u2 r+ ], P9 }

; P: N& r) P, q; U# \; v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
% h* ]: l# k7 ^        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 _+ Y' e% Z; d4 S& Q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
0 E: T  T7 O$ ]) Z- c0 h        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 V8 j$ k5 K$ n6 }3 C: |
8 V1 |) [" Q( c6 ?
        memset(tmp, 0, sizeof(tmp));
# a% q& }" N* j3 @3 L4 X$ Q0 D( n        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 3 W# y; ]# B+ C7 }  e0 k
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ Z2 H2 n; k5 D! A7 [8 K" H        server_msg_send(server, APP_CMD_LOG, tmp);
! h1 [2 S* {( C8 i1 c, o" u" C" R" Q; i* M5 {
        upp_error_count = 0;
+ @4 `9 q' ^- a3 Z+ t        upp_dmaq_int_cut = 0;
! o! j# I6 f$ t) u0 W4 A        // fill in data
" |0 q) I* ^, w        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 t2 l: A: V" i# }6 o0 h% Q
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");  w" u: T/ ]7 a, K5 A
* E4 _) \' T# g  |8 m
        // wait send success
; Q" A4 Y6 w3 u! C( @6 B        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' o( d4 ~/ u2 e' B

, _: Q; d5 p7 b. P- Z2 s2 j4 L! g        // make data node in free list
$ m( A1 P) W( ?' ^+ V: U. x+ e/ }/ h        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& O6 o( L9 O8 s2 f, \        server_msg_send(server, APP_CMD_LOG, "upp send: success");
- d! E1 u# k1 A4 {+ N    }- a5 ~3 s3 c9 D- q: `" g! }
    return true;8 n+ s2 \, ~( N. B$ \# A8 O
}
9 {4 r6 o" d5 N- @; M0 q& b3 U$ t4 N
; o; e7 ^% Y8 a, V. [: S1 j

' b4 J) _/ S. x
4 ~3 O; ^5 C5 H6 c" o+ Z: o$ `

2 N! i9 g6 {& w7 A

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 k+ X5 {6 u) f8 o5 O
6 V& Q; C  `6 ~6 t$ h8 b

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 19:28 , Processed in 0.038600 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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