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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , `, Z6 c" o8 p0 h

& J1 _3 @; L: ~问题描述:9 f; Q4 l# n$ w, O5 e8 c  t( w6 |
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:  J$ Z7 }3 m" j  l

. m, G' j4 G% b! ~" I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。  G2 R) n6 f0 w$ s& e

" H' T5 d4 {- Q测试结果如下:
/ Q4 ^4 i" O( n* N* s  A% f138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?! \: t. d% @% _) Y
! {- U- h1 ^2 s( }! |
  P' U: g7 O2 H
备注:
* ^! O( p9 y& S# \! Y8 @5 A) W1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. z: `2 c( |: ^, x7 h
2、相关代码如下:: a. w4 @9 O# Z) j
//UPP DMA缓冲大小512字节0 \1 x  W3 D; x* U
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 c2 K- w3 m; B* u9 c1 D#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
; L4 M) r( e3 C& Q* x#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). u, v! S& j6 E* C  ]
% `) `5 P; l4 `

9 @2 G# g0 G% b) x& h/ W//upp接收、发送buffer
/ B7 S( u5 d7 |5 h. W#pragma DATA_ALIGN(upp_buffer_a, 8)
4 b/ Y8 b/ X- D& [& T7 ?#pragma DATA_ALIGN(upp_buffer_b, 8)
) t, E" X" F6 h
4 j! N9 v4 _: Y6 ~* ounsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- K0 A5 M+ w! m& d/ o& `/ Dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# }, E9 \  J* K
, q2 s4 H& q# }) x9 }
8 L8 P& f0 ^* T4 W
static bool server_upp_data_recv(Server *server) ' M# O$ Q1 T5 R2 Z# M" ?$ O
{- }5 `( R1 c' G+ y
    if(server->upp_channel_a_recv == false) {
- v- B9 ~: A" i        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* m9 U0 {) [" V! ~
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! @) Y6 E: A9 i9 b. q
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ V. f" q, D8 i4 Q0 ?6 _

$ w9 i5 M( V! X: m- f% L/ T' w, h4 x7 ]
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% B! B: t! M. }: u- u4 h3 ?% k% R1 K
4 u' b$ l1 T7 m$ m1 L/ i" V' I" J            server->upp_channel_a_recv = true;//  ]+ \8 L- R! X
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
& _1 |; _: U9 y4 r; a* c            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
% F3 A8 G5 J( r( H3 v' s            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;& q6 J; ]% m6 M- ^& G9 X
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//. E, d. T3 @, J/ S' y
! W( \3 C* ]0 E/ [
            upp_error_count = 0;
" d) @% o+ \4 B, H            upp_dmai_int_cut = 0;. Z: w: F% F, c6 \' {

* o% G' \7 m, Y7 |& s7 X: T" T            // fill in data
9 x# B/ ]1 q( u8 `& a& c. N            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, y, k5 Q" ]: K
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ f, `- p9 s2 S* V) I3 v% J  C: V
        }5 L' u: q2 h8 x4 b
    }
: S1 H9 E9 c2 o* T( o8 R7 W9 g    else{
( c1 r4 H4 w" ]5 n: Q        if (upp_dmai_int_cut > 0){
0 J7 }9 `. j/ h9 B4 C$ O% B. G            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 G, S  |: n$ F5 U7 U" S: W/ x; D8 h            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! Q' y) v/ {6 E! `. x1 n! ^
0 Z, D, u* r( ?# N- _
2 ~- ^2 U& E) G2 `, u5 g            //copy data to upp_recv_list_busy, e: T! u6 x* C, y( a
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ g- D. o3 w# G4 S6 C
5 u. \2 x; V8 o5 a. \7 S4 N
            //' t8 x1 r- X4 k2 C" n
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
8 C' z2 ~) s& G
5 u3 R7 C+ ^* i. c- N            //
, i  ^5 v  @4 ?0 w; D% v! S            server->upp_channel_a_recv = false;//
$ y+ v3 ~) I- d+ N' s2 `7 L3 t- f
" H3 |4 c( q# c; D! h0 K% j: o            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 i4 ^8 D3 ~8 ]# Z8 j  T        }
0 a0 _0 P! S2 L    }: L, V; P8 ?0 {* E8 w

  U3 S- n3 Q  p( k1 z6 Z. m- r# z$ t; h. j7 p7 C3 e: _: R- w- v$ A
    return true;- @/ l  |; l& {3 R" V; X
}
5 a$ y7 O6 P% _% e7 u6 t% q2 D+ k/ t# c# }  b, H2 |$ B( E" U2 s2 F+ _
static bool server_upp_data_send(Server *server)
3 I/ T! M3 m' ]{
$ _& T$ @5 l0 {5 `    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, W7 T& N0 x. M1 g! z0 F        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);7 f  x. E4 a+ |$ K
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% S/ [# Y; G! b: o        char tmp[128] ={0};0 m1 z6 T+ y8 o$ D5 t

$ g" |3 B4 X. t& p; \        server_msg_send(server, APP_CMD_LOG, "upp send: start");4 r+ U4 K6 v: z' w
        print_log(server, data, 64);) ^0 N$ v+ O5 Y5 ~+ N, d& p

4 p" {. |9 p# O# i6 ~        //% y0 q/ C. i3 ]# |* [
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" u8 E' l' q3 X; W# `        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 `& _$ C( T- F- s! l  f# ^        print_log(server, upp_buffer_b, 64);& B0 [8 v+ |  c

9 Z  Z0 m  S2 N/ }- V, B        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
2 F2 m0 J6 n4 ^5 a3 q2 P, t        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; . v0 U" F; \4 a# F* s6 H" p$ I
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" l! E- ~6 B7 E
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 h2 ?) P' r! L" u8 B
5 a. Z/ j8 J4 |: o        memset(tmp, 0, sizeof(tmp));
  N  G6 q2 R2 m0 f8 G        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' |. `) p! f: u% L
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ U  r3 N4 S1 Q0 K5 x' O: F; Q        server_msg_send(server, APP_CMD_LOG, tmp);
# {$ e6 H; ^! Y! E+ N# H* \+ R% t; c2 g8 K  g6 v; q9 P  d
        upp_error_count = 0;
& c5 `- U+ h% s2 \5 F        upp_dmaq_int_cut = 0;
) o8 s, ~# ?# S  p        // fill in data ( m; Z+ O/ }* E5 A! @( O% u; z5 @
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " R6 a) @, q$ \* ]( F$ B
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ G# A& L" |9 E! n& n! P
* x' {0 A- K( R$ {! @        // wait send success
! h& P& u$ X4 Y* ~9 h5 `7 s        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * m$ {. E+ T0 @: L% _, d+ W

3 k. m! ]3 H) q+ A- z9 G: P& F        // make data node in free list
  ?1 ~( m, {  g- c; b        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
) Z1 a' x4 P, ]% u        server_msg_send(server, APP_CMD_LOG, "upp send: success");- k+ v  ]7 D* H+ k
    }- p4 f3 q/ C1 p  v  r) i1 D0 a) ~
    return true;0 P6 f( @+ s3 n6 v( y' q1 S
}: g' H; a: \3 L; l& C
6 d9 w. z% H" q

' f3 s  T2 t& e( f8 {
. X" y( \7 N9 `0 i# [
5 y& Q* F" B5 U0 r

9 G0 c) W+ E/ w7 n  [& ^8 U+ Z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
4 @: _! `1 G, r7 b/ S4 \* B$ _2 ^# l6 y: I% Z, p4 Q

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-19 22:43 , Processed in 0.039371 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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