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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! R. f. E9 r- L. j
- c9 k0 e$ a1 ?+ w
问题描述:
- G1 ?, B: I  a: T在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; M) C; D6 S0 Q1 C

& u5 A+ w5 P* H4 ?( d- l  A: n图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
- n. ~! S( r" O9 R) A4 l9 a1 j2 e0 B9 j: S% Z% j+ R6 ^3 i3 q
测试结果如下:* W. g4 D9 x  q6 q4 R. S% o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 c7 b% Y' e! Y7 c/ f

+ A* E+ Z9 D$ o4 h3 I2 x+ e1 \$ |4 p: ?5 t4 I( m  \
备注:
! i% u0 v: O( a2 V- G1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?; s( a. ]( I/ B2 X  H5 C( k
2、相关代码如下:) f! u) U. `* }- g1 ?% O
//UPP DMA缓冲大小512字节
2 w8 F6 a7 K5 J& b1 \- o#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 _. P1 Y2 r3 P% e#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
: l3 t! Q& V+ K* u#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ E4 W! l5 i7 z, C) \) K

" g) l6 ^! ]$ C5 T% x$ I/ L# j3 _
//upp接收、发送buffer
% M# ]) t/ R8 N# P& M8 r/ x' r, \#pragma DATA_ALIGN(upp_buffer_a, 8), M3 r; a" T: U0 m
#pragma DATA_ALIGN(upp_buffer_b, 8)6 R- k. F6 {: y0 B

& o) E- @0 O) O. Tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 b2 l: D3 {7 |1 ?# Vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
2 D; J+ X/ k) Z0 G2 l1 l* q, S+ e9 g7 t* w; E( |, e
  K2 v  u8 a9 N. o
static bool server_upp_data_recv(Server *server) ( |% R0 _2 J8 y5 Q1 i
{
* I1 I9 F+ s6 g) r* j! ]    if(server->upp_channel_a_recv == false) {' E4 W& F" E) E8 X
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
0 i! z- o1 ]0 ~6 h        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: Q$ O, J) D7 R; `- J            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 [- T+ W% e5 q1 ^
5 O+ N! M" W9 O
" f$ E5 g/ c2 l; z7 `
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 k0 O! e! x$ o+ i' ~
8 D& {$ _, w( C& R0 B; w            server->upp_channel_a_recv = true;//
8 R6 z1 d1 P+ s6 M4 q  Z- ^            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( Y  ?: p/ I2 l# }2 T# R
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;5 P) c3 {( u* t: Y1 T3 P
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;# J7 d7 V; S1 P
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//+ i, h  W5 y; v5 \5 @
) V) r8 n% Y. r; B( [" t; A; k+ _4 ^
            upp_error_count = 0;" x6 ]  X8 v2 {6 t
            upp_dmai_int_cut = 0;& H4 t% W. G  t  X3 U

/ Z' e4 d( w9 v9 U+ t            // fill in data
, V  p5 _' A$ P7 b            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
: Y0 ^" r  Q7 m, F            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 A& q) \+ x; L4 ^3 b; @6 _: c
        }
4 D" `0 K+ f3 L5 v' ]    }
$ t: [6 M8 F$ I  y5 ]3 u' F# @& a8 F. P    else{' D7 T& x' |: J, S
        if (upp_dmai_int_cut > 0){7 p9 s% n7 y& i4 V! U5 K
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
: ~/ b+ P6 ^: z) b, Z, j7 @            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);: c* r; G7 p8 e" _; `

7 l: l& ?9 ~) X3 Y% G- n  [/ c& d! a6 D8 W4 z0 |9 R4 Z8 U
            //copy data to upp_recv_list_busy3 q) u1 H% z& C# e3 s* [* z
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 c! ?0 B6 ^+ x: @
# J' x/ U+ H0 r2 N" [( b9 o4 `            //- Z/ a4 Z) i+ v& C9 w) |
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 x' k5 h$ y$ d/ D
1 U, t8 _% x% f5 o# J, l* w
            //
( f/ h1 G+ F8 u% v            server->upp_channel_a_recv = false;/// A& _( I5 h3 Q  t' g, C! q# C
0 c# f8 m! n3 a( F+ S
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ D5 ?) n5 D' _( d. u, I  o# o
        }" \0 l/ |% c. m1 v$ i: Z: b
    }  ^. C/ y& z; _
& h+ q2 v5 {! r0 O+ i* h$ i/ ~

6 l9 u, @0 R4 b    return true;% R' _, j5 E4 l, A1 ~( l7 P  R4 Z
}+ Z% E8 [0 q$ B
9 L$ I0 j8 z3 P0 R2 I
static bool server_upp_data_send(Server *server)) p) e, D) ^. w2 v& e0 F% ^  `
{
1 _/ X. W- k& B/ ^8 H    if(ListMP_empty(server->upp_send_list_busy) == FALSE){& j. H  b2 d0 g
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; ~2 C7 ^/ b0 S7 l1 a        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* E* R* A* [4 x3 n        char tmp[128] ={0};' W, o8 t( ]; t0 M

# M# A- D6 h$ i+ ]        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 b9 O$ D6 o5 z        print_log(server, data, 64);1 `/ G2 K, f9 J: B! p8 W

: D0 p. b6 |+ b9 ?6 F        //2 `! l- j; k  g
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% q$ C( ?4 Y% \% z        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( x0 e( D' q4 `
        print_log(server, upp_buffer_b, 64);6 M2 w. x4 R$ R4 H4 l

7 @; @; \/ c5 f! d; E        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);$ O, R7 F0 u: t$ C/ V- g3 w
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 1 k8 \9 m7 D, E5 Q' r1 i2 l
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
, v4 F9 d9 j. Y' a  R3 o        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; h) Y: Q# F9 w7 k! J# ~; v
8 X* b& f' ?' l5 n- }+ l1 G& `
        memset(tmp, 0, sizeof(tmp));
+ h+ i! K4 b4 F# t4 [- @        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; D: J3 |9 ]7 [6 G9 ^8 T
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
0 @5 s( X" U& Z+ j        server_msg_send(server, APP_CMD_LOG, tmp);
& B+ D/ n# ]3 O2 H5 |( X/ _3 Z& E
/ H3 s& ~1 ?7 _, p        upp_error_count = 0;& [. t! {0 W" O% X2 N; b
        upp_dmaq_int_cut = 0;
1 ~% k+ k. T0 [3 [% Z        // fill in data * Z# Z1 S: `. o& _9 {
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 K# H$ o0 Q* P( ~: M2 V3 |* M        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 r3 M! w( H3 w! X7 G5 {
6 D) _( w6 s) D+ Y9 [- F
        // wait send success1 l& H# q6 O2 f8 b3 n
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - X1 }8 _+ p) t' J9 Z

* h: J( Y8 ^5 O) N2 S5 l; ^7 J        // make data node in free list / L( @- c$ a( w4 y% u2 ]
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);2 `& x+ u. \& N8 o' D
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  c' n9 S! S9 B8 z0 C! V    }
  ]0 O9 h. B8 n4 v    return true;2 I9 J2 B  v. D7 J* u4 I
}- W0 y& k5 ^3 A9 t, U
8 z5 K* Y) c# ?! W7 Y% @+ I

% ?3 ?/ m1 {0 x0 g+ X  V* s( J. S0 x* L* h2 |) m+ t$ {
0 S" l; F. a4 @* H
6 r0 t3 E- P. i

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐( c+ v' S& ?( O- d9 V# A( _
* S- s  e7 _9 X4 s: \4 r5 N, L6 e" J% v

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-18 08:26 , Processed in 0.040248 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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