138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
! l& M' A( m! x3 D- g& W: m
! }" ~& O. `. U: U* E2 J& N! S: p问题描述:
! o2 e8 d. h3 w4 y$ Q+ X/ f; C在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* A' E0 k# ~# `/ f$ @
/ Z$ U3 I3 w& B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
; y& f  G" ^* A. s* q+ R4 v
% [) G  A0 S) J$ _" Q: ^% c* O测试结果如下:1 `% D0 V( M" }3 E
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. ~- g5 o# z; i
8 d1 w  j% y( m! ~' O
% ]7 j. S% f' K' B9 L$ E备注:' n0 l5 f- V# w8 H
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 o6 @2 [+ Y, I$ d
2、相关代码如下:
* M+ ]" `$ |  M% m! c. _//UPP DMA缓冲大小512字节6 e' T5 u/ W( |
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 X3 W& d& }( x, _* c& F3 C#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ W3 k9 A6 t( K3 ~# H6 s# e
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)$ T- T9 S4 L: c5 v: _

. ~# u, }# ~# `0 H* `0 _6 O/ {5 O  Q/ _7 D5 l- r+ R5 m  x. J' `
//upp接收、发送buffer; s  M$ g. j0 v, D0 H  B# k5 G
#pragma DATA_ALIGN(upp_buffer_a, 8)8 T( H( y# @" h) Q+ Z9 {4 H- Q4 l# o
#pragma DATA_ALIGN(upp_buffer_b, 8)1 r& ~& _0 v& T1 q

4 H: ^' l/ K+ C8 |7 u; Q7 yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 [8 n: Y2 n9 N( p* Z* B- X
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];" R* W0 b  `% y: ]0 }$ z1 A
" a) G- J% a  w  W& h  V

$ @0 O3 a9 a8 I5 lstatic bool server_upp_data_recv(Server *server) ) a4 e7 c  }* L6 n
{
1 _- c8 P  J. j. M4 j    if(server->upp_channel_a_recv == false) {3 E$ B  T* a: Y$ J- L
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: @+ L0 x, {: p2 ]2 |        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {& E7 r: t" o2 F0 I  _
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");7 W' A; W& ]* C; F8 ^2 Z: ?

2 L2 J$ `* V3 ]' y# v4 L* k. N% v* |: q
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);8 `3 }7 Y: l4 A  g3 Y. l, g

' ~, [% ~& R( `+ f, O6 A7 y            server->upp_channel_a_recv = true;//  Z: e! v$ }& ^9 q2 t2 a
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);  F# h9 a2 t$ _% h8 w
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;7 W; |7 H( W! {( a2 t. r, Z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
# w7 \, A0 }7 g! q  i& Z            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ W' E7 A2 V; I
  W; g/ p" K( h% d. @/ L            upp_error_count = 0;
! Y' l& e' u6 v3 }9 h            upp_dmai_int_cut = 0;
0 L# }) Q/ G3 [8 [& s9 r( y# p
. \+ h4 i+ f7 R( B. g& g1 I' W            // fill in data
; t. V% @4 v. d& t% i* x+ h+ u0 Y" F, k            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
' Z, s( G* c+ C) C/ q5 f9 u            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 x+ o! U3 U& S6 G, R2 U
        }
* f4 S9 L7 j( g% d3 ^  v1 x4 C    }
  C& a- ^1 q0 O* }: C! P3 t; A    else{6 P# C7 ~* _. Z! B7 S( z
        if (upp_dmai_int_cut > 0){
, y; e5 ?5 K5 C            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
  ~6 l2 n  }. a) t1 S0 C% A            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);6 J1 F3 {# A% [
1 o/ o. C' k( K" m
5 E$ e1 ^1 F9 `+ o1 Z9 ]
            //copy data to upp_recv_list_busy6 y6 v! v0 z8 h% q" @# D
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);# S: V( Z8 B0 a# B) g

4 g% t$ Q  }4 n, X1 W! n- z0 b+ C. ]            //
( x+ R4 t+ w" O2 S) I" H2 {- @4 d            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# F! {  u' |# g0 t) Q1 _5 ~5 d# F+ f: W( a
            //$ U' c# r# p: ]  u% d, D
            server->upp_channel_a_recv = false;//
2 l0 U: y8 w! a# r+ g# r
0 W4 c; x$ g* }# ?- _            server_msg_send(server, APP_CMD_LOG, "upp recv: success");5 Y- b7 A" x. c) L) A
        }8 l! @. Y9 `# a5 v* E
    }
3 }2 x/ V& R) u/ o8 d0 q. z8 f" r4 W) T5 A; ]8 g# q, }& l' {
8 O& P, x" y1 j, F8 w2 ]- Y
    return true;
& v/ N8 }2 J2 b2 q2 v}. v) V7 \- a/ q- n% D- K
: m% @/ p8 U  }, L! H& e$ k  H& J
static bool server_upp_data_send(Server *server)2 |# _4 Y, G; j( a
{7 Y* ^) U7 ~! k5 u
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 l4 n3 N) j2 b
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
+ E0 q" C# Z/ K& J        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( V( F5 v) V* l- K* p
        char tmp[128] ={0};: A% u9 o! G: q* l5 e- w2 A3 A  v: @
$ i+ S# L- j; Q9 ^- }( k
        server_msg_send(server, APP_CMD_LOG, "upp send: start");, d: E1 e5 M! {1 h% r
        print_log(server, data, 64);% k7 h" A% N; @* w2 _
+ r* f- o4 v- h* h* r: p
        //$ D1 M( i! @9 v9 V1 q5 G
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# q; Z* h" `) f2 v7 l8 g        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* j# ~& a! A' R  |
        print_log(server, upp_buffer_b, 64);% }2 j* N: f( s2 ?3 b( `# s2 o5 f1 O

# n6 x) U" U( ^5 L: O/ t8 n' l        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);* L& v9 Z+ x1 D2 P+ h$ U
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; / w; |/ Z# |. G. m8 N
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;, E* d. N! f: F" t7 V( z
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- {& A+ M3 X1 q7 g4 n3 M( T; N# i3 S4 \8 s8 z3 ]
        memset(tmp, 0, sizeof(tmp));: E6 Q' Z9 T: ?6 d, [
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 ~- g, Z% q" A4 H2 }. Q: b
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);8 O5 G1 t7 A  P7 W( S8 Z
        server_msg_send(server, APP_CMD_LOG, tmp);" J5 h) N8 f' c. L, ~! r  L5 G
& C0 R6 ?8 i# F1 r
        upp_error_count = 0;
  b1 o3 S( |1 Y% B9 k        upp_dmaq_int_cut = 0;
4 c; H. U; `3 _, ^# \( I9 v        // fill in data
6 Y$ W1 |  l, k+ l- x- k: D4 L- i8 ?        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ H2 ?* {* K% a6 V2 Y        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 m/ g& [5 @" l0 G) n- M' }6 }6 {3 j! D0 I3 F0 `% ~8 a: q
        // wait send success3 P: Y. ~3 a) C' M( j; B$ `6 O
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + _' k; V- i! f0 q8 o

( s3 D  u. o/ |6 V% x! W) z* |/ W        // make data node in free list & V1 l4 U3 i5 Q4 z7 t" g9 _
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( y8 a. E3 U4 B+ K( S0 V
        server_msg_send(server, APP_CMD_LOG, "upp send: success");( J& U/ L; M$ y( T9 ~
    }
7 m( j' |; l3 r+ C* W9 |    return true;- s% Y% Z6 B3 @: n$ Q: t9 R3 r* h7 P
}+ u$ `& T# H# N( `/ k
! n. R1 Y# d; b+ ]

6 r- V8 [; i' ^. [& y( u3 m7 D1 K4 c
1 {$ ?7 X+ r& m8 Z* M

. M' R! v/ m( i3 u; z/ ~! W# {; z- Y4 E" x$ u+ l9 i

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐, P/ u5 Z+ f" B% |1 M

1 i, j' d' {5 W0 W8 _" W

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-8 12:22 , Processed in 0.042366 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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