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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! j) G/ O7 N/ f3 l* g+ R
9 a( }7 @" Y/ k( y
问题描述:5 b( c3 ]. R- H( u6 c
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, g  H7 F3 H- z) r, a$ }6 X5 P. p7 o: h2 \% Y' R, a7 M
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! n; s" u( [1 \" a8 M! O( {. w, G
测试结果如下:7 @0 u$ T# u' o
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?  f# q6 ~, S: r/ a8 e

9 u2 p0 @% n( Z- D5 x5 N1 `4 U7 T0 r/ Y/ f  D; o1 b- c
备注:
: B6 a$ |0 y' ~4 z" |; f8 Q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ m  P; j! }6 P! G  v: c0 r
2、相关代码如下:# W3 \2 x9 h+ S- D
//UPP DMA缓冲大小512字节
' A# P# F' k& o, {1 L' l; F/ z#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
' _3 o; [2 _, T7 w5 p2 t2 k#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* ^$ y, J% X8 X2 R3 g#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 X/ ]) a* S/ D- K/ y
2 F: r1 {# G% k# G3 O+ b

$ t5 Q4 V/ ~. K( R8 v( M- z2 j//upp接收、发送buffer+ g# h8 H  L4 Y9 e) ]' I
#pragma DATA_ALIGN(upp_buffer_a, 8)8 ^) A1 G: ^$ f$ W
#pragma DATA_ALIGN(upp_buffer_b, 8)! H+ w4 U3 m5 U7 A7 y3 C

6 X  ?. i/ b2 y* R; h$ Z/ ~9 I, runsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 V+ v6 l) J" D% m
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% }/ ~# G# X/ Q! h9 r
) {$ J9 }0 D3 f9 c# W  {
" R0 x( d9 q4 N$ q, d. {7 rstatic bool server_upp_data_recv(Server *server) 0 B+ O& d. K2 T8 _5 X8 S
{
9 m& m$ f# D$ E' X! V    if(server->upp_channel_a_recv == false) {
6 u$ Z. f# x5 q- Q; @6 O; c5 j        server_msg_send(server, APP_CMD_LOG, "upp recv: start");+ l+ [: k# D% {2 Z/ V, i& P
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
' i! K" }+ `# A2 a- ?            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 C( [: R9 ?& o8 x6 F6 P
" U+ b# O: ^6 Y8 G4 x+ j3 w9 L% R7 X
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
% ]0 H" e% h: w2 t: I8 i5 T+ c8 d
            server->upp_channel_a_recv = true;//
+ H3 A; Q% I, J9 O9 F' T% l( L            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);/ I0 G) r! b. x& V0 z* O% s- a
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
1 X5 U  c" G! q4 T3 U9 b            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;; x- ~5 A: D5 [5 [5 h& R
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
. g+ g. n2 M) x6 o" }; _$ P# ~9 ^
* s/ a4 Q' j% C! l# B' ?            upp_error_count = 0;
0 r# w5 R2 a" ~4 r" F            upp_dmai_int_cut = 0;2 r, R4 e( _, D% K
# ]8 I9 }( t& c3 ]/ Q  F
            // fill in data 2 s" q6 G# R$ }2 d# [6 Q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);! ~& D8 A$ j: Y# z7 b* W
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 L5 ~1 ]1 N- J- z        }
1 z, a. j$ E9 V) c    }
2 X$ o/ K* W- w3 y! N8 L8 }    else{2 r2 Y- Z7 @' M1 G1 E, T$ V
        if (upp_dmai_int_cut > 0){6 T  ]1 }2 O2 {  H7 v  F
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 U2 o+ g; ]( o3 y) K2 v8 ~
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);% ~7 D: J. f# x7 [. m3 y# v* k: ^
( M' y4 E7 C! X; Z7 p. H
" H, {# j, u1 s/ x
            //copy data to upp_recv_list_busy
" A8 K; `3 t4 `" ?( ^% q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, k' a& u2 p' P7 E& p
  F4 w7 ?/ g5 d4 W' m9 o            //
- Y+ v. z: }7 N7 T8 y6 S; {% z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' F. c" q9 P* ?

6 E! Y9 |* f) S! Q            //4 j8 `# t7 O' ]% o' [0 k
            server->upp_channel_a_recv = false;//% Q9 Q7 t) ]- t+ ~" t

2 b3 W) W% A- `- C! I( |3 C            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 c* t: a7 ^; J  V        }
3 A2 m: e$ j1 c. V: A: B6 w) z    }
4 X' z9 @* h0 A$ @1 z+ p: k# z1 o; P$ m* r$ c3 C# |5 S$ H

4 T3 d5 [( u: l5 E+ f; F/ ~    return true;+ q& q/ s' p' f5 [0 p$ R: b, G
}' b( i& b: [5 B

9 L6 n! p! n( S) G" Mstatic bool server_upp_data_send(Server *server)
& `$ b3 l& |, q: ^5 t+ m6 w{- f3 ^9 r+ z8 Z5 |, q! M
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){( b7 |0 K) v) O) i4 H
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);& x3 Z  V5 t% K# c" i0 |0 A7 A2 e
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 v# ~& ^3 ^, d# v4 ^        char tmp[128] ={0};
7 Y4 V( M# Y# {) O5 y; T2 b7 A) n- v3 W* _0 d
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 V5 O! a4 P) {) O1 ?        print_log(server, data, 64);
3 Z/ `0 I; B* v6 R5 u8 p. B1 J
+ h: L4 s0 Z$ S9 N+ a        //
: `$ i; |- O* X# `4 f        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);0 P: S* a  r9 q1 n% h3 b
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 X1 \1 N1 H% b0 F0 M% z: E
        print_log(server, upp_buffer_b, 64);$ |9 a, g9 b9 f( O
# s* z$ \5 w( `4 {# D2 B9 F
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) D+ I% K# W& i/ q+ K, s
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 5 G( h$ N. t6 z- ?, s$ j# d
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
/ Y- z/ b2 d, k& k$ ]2 j% u1 v        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 L& p' V  S! U; P
" q/ f7 }7 g# m5 Z& A, m! b6 }        memset(tmp, 0, sizeof(tmp));3 e+ }9 q; f+ z$ w" w
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 ]% |( K. j/ W2 \, X/ W8 i
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& u5 {/ B0 p1 W; u% [" _
        server_msg_send(server, APP_CMD_LOG, tmp);" g/ |) A( P6 r$ T1 j7 g! H

, r1 \2 z$ T1 p" N- z; r        upp_error_count = 0;
# b3 Y7 O1 L& t3 h, |        upp_dmaq_int_cut = 0;, H7 w4 X3 n. J& f" v
        // fill in data 7 L1 r( B- Z# w
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 \9 v/ O, l' H! \5 @
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ g: `3 _( ^6 |/ V$ S6 I! O; ~
$ I* @! z8 B3 B9 b0 G. C        // wait send success
; Q2 u0 w- }& L$ t: y* ~        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * p* h8 {+ f9 C9 E1 E( x9 {

; C& M+ g: `% f, T% s# M6 f        // make data node in free list
/ W; @5 d8 h, z& n1 n* Z6 d+ H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);, @. L0 l& k! U# f8 l! T  J: Q
        server_msg_send(server, APP_CMD_LOG, "upp send: success");! q8 w' b& W1 B2 n
    }. H( p, U: Z$ L0 j6 j  Q% i
    return true;8 J+ r1 v+ S9 X. {/ E& `
}
4 W# b, Y. V: Y( b- b. T: m7 W, i  f) N, B, k! @7 L2 D" V
5 J' ^5 M( Z" X7 c

! y& b) [8 r  a
/ q) l6 H5 f0 l4 P! j# a# o; u

: e- o# \% l1 x/ Z7 i

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ C* f: s. T- g! S

0 g6 W2 v& |7 ^5 c$ T* w  L

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 05:03 , Processed in 0.037425 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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