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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , C( }3 _& e+ W$ h& M5 _
5 i2 |$ q5 U3 U$ k1 W; W
问题描述:
; x5 N  P  ?6 }& k  k3 V/ k1 B在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& U) z. b: d% \0 I( ~- k. R" j
) `! y' d  l$ F& _8 _% f0 k
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 h: m9 b9 d. p" R1 Q
  d. z% \  t; V8 i测试结果如下:
; G1 r4 d4 d+ U3 W138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?8 M. k$ v+ A7 d" R( I
8 I, f8 ]7 f  p" e$ p
3 E; Q: I* J% m: k8 t
备注:
+ T1 ]3 ?* l  ?6 K6 j1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* ^0 C1 Y; W% \, B& o% G" k- v. }# D/ ?
2、相关代码如下:  c8 r- F  N! X# W7 z
//UPP DMA缓冲大小512字节, N' F- T% ]7 n, j
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" o2 K5 U  S; a& d) _% z
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: T" _; m. o" y
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 v2 B# @- x7 f$ i" C
' a( O3 f# b, }0 ~$ A+ z  p6 W

- |$ t5 P3 t) d//upp接收、发送buffer6 C" O+ x0 r$ `* R/ N  `. O: y
#pragma DATA_ALIGN(upp_buffer_a, 8)- ?; p2 Z- A0 O
#pragma DATA_ALIGN(upp_buffer_b, 8)& O, p2 N/ O; l

' _5 k' b5 l) M2 [* zunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& X* D; Q, H9 C8 h+ Runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 U7 b' g7 a7 m5 O0 ~8 F* q' {7 R4 q: X+ c0 o/ d3 z/ z6 R/ {

2 U5 M  D4 e) E. e3 Mstatic bool server_upp_data_recv(Server *server)
' @( X; q& M7 l  _8 S7 t6 b{
' z; N' m9 I( q0 l' T    if(server->upp_channel_a_recv == false) {  B" W& O7 w; e  v( v2 G3 h  b
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");% B: F# x: m/ F* P: y/ Z6 ^& G
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# w1 t' R$ z  V$ k. |; z+ `3 ?            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");* V  ?2 ]% K6 }9 A1 \

4 ?1 [* S3 T0 y$ L9 |7 [# U; O( q5 O5 c9 d" c8 s1 s' L
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( X- W" V! N! d% }: e% y* b

7 @/ T1 K) A" v            server->upp_channel_a_recv = true;//
/ m9 z& T, K; R, p+ L. i4 |; P2 Y            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);2 r6 c/ G. ^; x: O6 Z* o
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;& o* C" Y; r! l9 S* ~
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;& J( ~7 T' i! O5 W7 \
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 M1 E2 R! |3 {3 I1 ]- O5 e* P- j; n* c" C
            upp_error_count = 0;
& z( Z0 {' p7 F$ w2 a            upp_dmai_int_cut = 0;/ X* y) H, [5 u
' G; a' N" Q& S
            // fill in data
7 I+ G, [3 z, N0 N+ t2 r            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, ^# e" d$ D) {% ?: R& R/ l
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- F# g; C8 p7 @* y* r% y* E
        }, ^6 E! s0 p( q+ w, n& t! H! l
    }0 l  f2 M/ k% Y$ u& ~
    else{
$ F' P- U! d6 @. y; R" D! C# U        if (upp_dmai_int_cut > 0){
+ v, @( G1 Q  ]; p2 w! x8 ^& ^            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
0 o! y' w& a  ?" Y$ E            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
. k" R& W, b. g$ [; _. S
! `4 ?! n" k5 }* s  z( b8 X- s9 X9 a) a! |' F! ?6 X
            //copy data to upp_recv_list_busy
9 ?/ [7 C, F& a, p* B            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ u+ V! ^: ^+ c+ K, E* k- K
' {. P$ l1 J. A
            //
; l; P) n1 o! `4 `' x: s! R            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 {1 @) [( F( \' R' v
/ X; w% F* q' S9 J4 K
            //
/ t) L' v3 I" v6 m3 r2 n            server->upp_channel_a_recv = false;//
; M1 e* P9 s* e6 s; @6 K; a8 H" V# f/ X) E
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ O4 Q! N$ e% U1 [& K
        }
1 ]! T: a( x) `8 a    }. C# J9 N8 e! w% p4 K& n7 m8 _: t
1 Z9 m5 m' f+ h6 P

; F; B* U! x* s1 l3 }8 w    return true;
' X* Y2 i5 D% h}( Z  G2 y1 [& i* P  `  V# r
1 p" X/ ]; N/ |) N, [
static bool server_upp_data_send(Server *server)
: V* N0 W8 r* g4 f% @* e2 Z{1 C9 e  {/ h" ^- \+ W# e* D$ Q
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
6 v( b% v' o" T% p        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' o. x4 b3 w" z        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ k  Q0 B' X" Q: [8 L
        char tmp[128] ={0};( P0 M! B6 T" s6 E' Y7 A+ ~" u

! t+ m$ f! |  S; ?4 ]3 I$ F        server_msg_send(server, APP_CMD_LOG, "upp send: start");8 o* k9 {* {. x  I4 H" O0 B" F% ~, o
        print_log(server, data, 64);3 D& Q! l! D# B3 v& h- D3 V0 e9 \. I

( L2 K6 `1 k! c9 O& S5 m- \/ e3 f        //7 T* _: R( V5 F- ^2 j+ B
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);5 R  ^& D# a2 w9 z
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 T# K4 T, }, ?1 u        print_log(server, upp_buffer_b, 64);/ O& q& L5 U  t1 Q7 H/ \
$ f: v/ u: M6 Z( `8 B
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);# q' a4 k* R: W4 w
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
8 d# e/ H$ `) u, i        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; ?, F: y( n( B8 P
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! y1 P* [7 w! \# ?

, J2 V& A+ w5 \- n5 Z        memset(tmp, 0, sizeof(tmp));! ^" J# q; g0 P9 j" h
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 0 Y( [5 m0 u# Y- H' G2 ~
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 G% o/ c& H/ m/ A, S
        server_msg_send(server, APP_CMD_LOG, tmp);
+ s& J8 g. u, M
, c+ Z- ^. O. W5 v        upp_error_count = 0;
9 X& R  k4 A( x7 a' B0 F. s* `        upp_dmaq_int_cut = 0;# Z# `1 t" F) o; ^/ F
        // fill in data # {: b$ t+ V) \3 ]/ T' w
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   o$ l0 S6 O: J! }
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
9 K% M+ R5 Q$ v% w
1 ~+ Q1 H5 t4 y! m2 @6 L        // wait send success$ g3 C0 u& a( b( h, l! f$ C
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
" u2 [& u  e, [5 [9 K7 V; {/ c- c% e+ c, h' q7 X: `5 k
        // make data node in free list
/ ?/ p8 J; _* K8 D# S' R# B2 C: R3 Q        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
  d( ?* k% e- C0 c, _1 V3 w$ W7 I2 P        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 Q! G. J' t  U% U4 z! D+ z/ L. ?    }
) v! s6 B! @& E    return true;
# K- u1 F0 t7 f! p- p6 x  m2 r7 t}" ]+ V; O# d4 y. W1 f
. m8 Q  M; f+ C" H! _* s, ~  Y

, }' }9 |2 O) _
& g! o  z) x5 G% ?& y# R. j

, H9 Y- ^4 Y; B. l8 L+ ]% m7 K, h; [) M+ ?9 O  m0 g4 i* Q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
+ P4 O; ?( o. N; I. X, S' i: A& h$ y6 A4 U

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 06:51 , Processed in 0.041250 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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