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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - I3 P, f/ h0 l6 V7 S- ?* R$ Q/ \) i! M

7 N, Z* f0 i" X7 u- x问题描述:
4 z7 I/ ]0 I0 n在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 g9 n8 ]2 _  Y$ M) x+ O

) H5 d6 z1 S6 ?9 a6 [) n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 G' L/ A9 M7 T3 E( S7 E( Y. K- ]( T# h7 k
测试结果如下:
2 a6 O3 ?. ]& H  n' V' x7 \138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; b, g& }  c, @% w) O' P- f* K0 H2 y3 c. q- S* {! E
! |& M2 n5 b) X
备注:: g5 _- F6 [/ n. r0 S& h- V8 J% C
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: D* M; F. x- M: H* ~
2、相关代码如下:
  T7 q. A: F. E2 [& u//UPP DMA缓冲大小512字节5 g# @( T% z& t( d
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
  U8 F3 _! x- k, o0 P#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ s9 s: q" f0 T* R2 E
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% `* |( k1 y  [& C

- |/ Q, S# D+ f1 X+ |* v, w3 X! h) A) e5 u* V; N1 X
//upp接收、发送buffer
1 R, O3 J9 i0 `. W7 w) p% h: k1 x, c/ ]#pragma DATA_ALIGN(upp_buffer_a, 8)1 J& L9 P+ s0 M& P) Q
#pragma DATA_ALIGN(upp_buffer_b, 8)
% j- p) s! p& |! [5 e* U9 e' v' ^: Z/ n' ^1 _, F& a' _
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];3 S4 `2 `; w2 H
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, D1 O: p- ^8 L; z

& j/ C# V8 B9 J; }0 F* ?( l) d7 e: n6 W1 I4 q+ Q4 _# l
static bool server_upp_data_recv(Server *server)
9 Q( j9 U6 Q6 `& m, c0 J$ X{
# @* b* i) m9 Q2 y    if(server->upp_channel_a_recv == false) {
( Y+ f2 k+ ?& V, E        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( T+ C0 d1 _. V! @1 L) S1 h
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# G0 z% Z- j" U/ d" ]            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");9 e0 t# `- k' ]9 w, M
# U3 K  v2 T- m
" V) g: E3 w, ?  W: _7 n  W
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ M  h1 U( L$ C* u; p  z% Q1 O  z
            server->upp_channel_a_recv = true;//3 r" Y, y2 B7 |" w0 i
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);5 O5 n# |; V4 f6 E
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  C8 q/ ~! n8 C7 |  e, z            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
$ A( h  R1 o$ M, j) v. y            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//  O5 _- n0 e6 K9 n, {; d

( W9 f# C, I, Y, G            upp_error_count = 0;1 V1 u2 {) {% G# }# `6 O& m
            upp_dmai_int_cut = 0;( W3 T2 f1 l0 h* d5 O9 I0 }
9 r  F- a# M5 z4 L1 \
            // fill in data
9 m8 ^8 A+ ?( S* K7 f            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
1 r- ?, @8 D$ J7 E* P            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( \4 w) ]& Q% d# r0 v: [4 k        }% Y0 o1 Y( k& a; M" z
    }
2 K1 I. e5 c0 n; Q7 J7 |    else{. z% T: P" T; B- _' o1 B
        if (upp_dmai_int_cut > 0){$ ~9 o2 F6 q# p* q6 g
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 ], U& K- [2 \
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
' \( [+ m1 _+ Q4 M; r. r" {) A; |) a9 o* @% |

5 g! B5 z/ \$ [- Z0 e. T            //copy data to upp_recv_list_busy
* a. l  B6 p; @4 E            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
4 i: I6 `/ p! \$ x: j+ W
9 s# H/ P. h  q  I* Y/ y            //
7 y9 v5 Z0 D2 L9 X, d1 }  b- S" Y3 ?            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# }6 `# g6 z( |3 _9 d, d7 }
! z' Y% K  I2 w6 I
            //
: c! b9 Y3 a5 E$ g) c5 N            server->upp_channel_a_recv = false;//
6 f, z5 B7 x" I; s3 j* y; V3 Z- b# Y, H( q  q
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 ~- |: x" Q5 h0 m1 ~+ s! w: L4 g        }
: \8 K; i# W; S    }6 }# w- k5 Y) i( J

0 l2 d3 A; ~# A/ O3 z% b# ~* y# Z
6 F. q- Y% S1 e  g    return true;
+ i3 L( @' N7 _% a}6 h9 O! ?7 ~/ v* }8 Z0 j

7 a  h7 W2 T9 I: a6 astatic bool server_upp_data_send(Server *server)
3 t1 A1 b$ U4 I7 {- ^3 [3 a+ u{
) ?- [2 ~- M0 P0 I    if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 b4 [  H* d4 A
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 o! i( [# _1 a
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. b. \! h) [; l; }2 l' v* d7 ?        char tmp[128] ={0};/ X2 N$ _9 Q, h0 H  V5 @

! S' x* v" m  u* c2 U5 K        server_msg_send(server, APP_CMD_LOG, "upp send: start");
; a4 ^% x0 c3 g" v" M9 v        print_log(server, data, 64);
% Q8 \+ [9 F; i8 Y/ J& m% z( Y: D  h5 u  e  m8 l
        //7 v8 j: _& M6 }3 K3 x' C, ]8 S
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- ?, s% p- ?( Q6 O6 _* Q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ x5 j4 b; z* T# \+ S  ^
        print_log(server, upp_buffer_b, 64);( r6 u2 c4 a2 A! z7 s

7 c' k, X+ V, M6 Y- F/ S( E4 l        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);3 ^* _* M) C( N* `4 E: t' p
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; : a, [1 V/ e( K8 O% g8 s. d
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;' q7 U$ M3 R. K4 a
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 E6 k- c- b; Q; ]7 O( ?
; s+ h6 j- g" W+ B
        memset(tmp, 0, sizeof(tmp));2 F. g8 d% D& i' f( N+ O2 e
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 h% q& V2 S) G6 H0 R* m. s! n, e
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 K5 N% R7 Y! ]7 {- X
        server_msg_send(server, APP_CMD_LOG, tmp);
7 V" {" _) X7 B% H- e; B! w. F9 [. R0 F3 {
        upp_error_count = 0;
# d# O, k. F( A6 F2 Y! _% f        upp_dmaq_int_cut = 0;( f/ Q0 Z( \( E1 o# m
        // fill in data 7 q( K" p5 n( B; b
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) P- l( {. [# V2 v2 r. P        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* U' v4 W" [( w9 ^, k/ _$ R' X& k. s

$ B( p$ }/ p% O, A& o4 q  D        // wait send success
: C/ q, R4 D: Q( g        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); / `2 _) h; C% P7 L" ~* \
. ?0 i. R3 \4 {! T- N
        // make data node in free list
$ b; y( Y( q& S6 Z0 @+ R        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; R! ^" W7 b. r" F
        server_msg_send(server, APP_CMD_LOG, "upp send: success");! r. Q3 ^3 b$ y0 n  V6 Y0 X' H
    }
. X4 [% q# c; w( z- @; R    return true;; D& s. U6 ~/ }7 V
}
! B) `; J* G. ]% h9 l
8 t( i3 A6 }3 k! J  J, d) N

& A0 C; g. V$ o. h$ r4 N
& M# r- O0 V) l! R1 [

5 E* {  k$ N+ r1 |; C
9 b- ], ~0 v3 k) y6 t' W) `% V( z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐. o7 ?' H' A8 b7 U
5 N' t  S& z3 \4 c# f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-10 09:39 , Processed in 0.060276 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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