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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 h8 X! ]; u1 Z* H; v5 ^5 ~" s
9 V9 h8 X$ w9 `: C
问题描述:
* l$ q/ t" I( K0 T$ }在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:0 o: _' l7 b  ]7 T
4 ?8 C  e' q$ V  e  X& U% L" {6 n" W
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 F1 w" z5 t# K/ x; o3 n4 i& b. O. Y; A% k3 z
测试结果如下:
% l, L- \; [1 A' b: b138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
* G% \1 D2 t( Z3 o, h4 v& h9 h+ K! [" ?% X6 M! e' }
* [4 S- O7 e+ ~. G$ y+ c
备注:# J  I6 ?6 U. C' [
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 ~+ ~& d; H  G
2、相关代码如下:
) v5 P4 U" d& B6 c3 E1 I//UPP DMA缓冲大小512字节
. O, q1 `( u+ `& }#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 p7 w1 S# ~6 ?4 |2 q8 `" ~; `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 i! B% N! k7 Q- A, g6 v* i
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)8 \& S* t* |4 j4 Y! U: X

/ `# n; u0 s6 x& E1 O6 H, y# Y% O/ A# P* Y. N7 o. g  M
//upp接收、发送buffer7 T- Y* _: d$ K; X7 `/ U1 X9 {4 V
#pragma DATA_ALIGN(upp_buffer_a, 8)+ D7 M5 U8 W* a1 y4 n  k% k! c
#pragma DATA_ALIGN(upp_buffer_b, 8)
) g: u0 L6 w: o
/ Y& N' r) {1 D# T) w6 y) v5 Eunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& t1 a9 B5 X! A, g1 K5 cunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 @# J# s. X' [6 J- w
/ c5 `/ v/ O4 i# I/ E: T& V( O$ |3 `: W) z% f
static bool server_upp_data_recv(Server *server)
% B# E0 m' s7 B0 ^# e{. P" @- i. }/ k7 W6 ?
    if(server->upp_channel_a_recv == false) {% W: `/ o% @0 e
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");  [$ O7 a4 F4 w/ t7 @7 E/ f
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 S" T- C4 l  S. G% I
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");& q( T( s( {5 ^" t! ^  p3 c0 e( ?
% e3 N. x2 O: ~! |. C- k
! G1 B0 h7 D, w
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% ^7 c2 |. @4 @6 g) F: ~) b1 o

: o1 }  [3 v& b1 o            server->upp_channel_a_recv = true;//
5 G$ I1 F! x9 \2 `2 }            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);% Y/ ]0 d9 ]. V* t: H/ V
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
3 [5 O) c: K) c+ G# z: g( }            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
" ?& S+ Q2 W4 {            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) f5 m/ Z8 l; @6 g7 Q- y

$ K! a. \( `- g            upp_error_count = 0;& U8 Q+ B6 W' p* e. a
            upp_dmai_int_cut = 0;& h) n. ?0 _2 A* e( F4 U% a
5 {0 D4 F4 U% `; }& j$ D
            // fill in data 4 X1 K5 U: f5 e; H) ]! m
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ m4 y& E+ S; ~( k9 S" G0 o            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( R4 F* n0 x: T4 Z$ }        }! H2 R' ]$ U' q; l, I) A
    }0 i3 h. X' _: {+ c
    else{! `' l5 Z% {% {2 _8 W4 L5 j
        if (upp_dmai_int_cut > 0){+ h2 c- L$ b/ A" D3 V5 w  d
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
  q0 w( \- v6 b            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' {- t3 m1 l' x3 P$ N
5 l! _2 {! ?" @9 w+ K6 e

' S% G& Q! r1 [- h0 F4 x( z            //copy data to upp_recv_list_busy8 R1 ~1 S- L- p* v1 Y
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, G$ C' c- c0 ^( v
8 O& N1 L1 y' l! c- g6 J
            //
9 M0 c1 U& V' S8 e6 I, R' k) a7 h            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- s% d9 s8 H3 v3 j- ?9 ~3 M/ L& c( _  D
            //1 T% y( h# O. c+ o* R6 P1 h) k0 a
            server->upp_channel_a_recv = false;//
& @/ l% W' K$ a: t' k' x
. T* e$ V+ \8 ]            server_msg_send(server, APP_CMD_LOG, "upp recv: success");0 Z0 K7 T  ^; b
        }4 B: H- t+ F. J1 g) Z& E* z: V
    }1 [- {0 q0 w" e' x' I
. S% L* l7 B$ H6 y

( B8 x$ E5 _( K7 N; Z8 o& F    return true;) J# P' E) |* i2 f6 R
}1 R5 j% j- L# V$ J& |

, Y" d; r$ _+ C2 |$ t7 i9 tstatic bool server_upp_data_send(Server *server)2 E  X( z& t3 Q! J7 v; s7 n
{
) a5 k4 ^) e5 g& Q/ ]1 D    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ r* m: j* g; R9 B6 z
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 A7 ?- N) r; ?1 d/ \
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
' h  I! r, l  S* g  }, C7 V        char tmp[128] ={0};
4 u& C" Q  V! Q: E% A2 T, l# `+ g  X0 i3 F5 W' g6 x( k3 Q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 Z, r+ t4 R2 |- R# T7 Y* j+ y+ H. ^        print_log(server, data, 64);9 [! Z4 q' T+ v- M  E, B
; a! z: e! d8 e
        //0 n! K6 C+ {; o& }7 [
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, z- u: W6 z4 x7 O& n- {& E        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
- A; w) S3 f7 N" @9 g; L        print_log(server, upp_buffer_b, 64);
4 T) {) N$ P% m0 ^: B) s' @0 b( `8 U( e" q5 x! e' {
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; J! b# g, s, \3 x2 u$ Z1 A  ?# j
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
* S; ?& k  \4 N2 j        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
4 q& E8 b! ^% [0 b# a. k* x        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 v) u* y- s/ _$ O1 Q8 o) l* E, H0 ~- q: r+ v5 B+ B2 G
        memset(tmp, 0, sizeof(tmp));
. a' W/ @( R6 v9 @$ Z! |+ B8 z        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
- \, K! C2 T6 J5 c( ^% U            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
6 @3 H$ o8 w& h7 L+ G        server_msg_send(server, APP_CMD_LOG, tmp);3 H. j/ y0 A  L5 f9 C$ R. ?
$ |1 t( A  r' {. I9 l/ ]
        upp_error_count = 0;
$ t8 ^% x0 p$ g8 {4 a- r0 y        upp_dmaq_int_cut = 0;
4 u& H" r4 u! e; G; D9 ]$ l        // fill in data
1 f: ^6 L/ y& Z; J8 {$ q' H        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 1 n2 h9 B5 E8 q# q3 h
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
- T0 }! C: ^; Q& r4 q2 h6 a  ?* L4 U7 R8 x
        // wait send success3 ^# }" U. G( Y8 t: O  O4 z& Q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 6 U% v; x2 U4 ]! _9 z

+ g( ]3 a  d' S+ {9 L8 l7 T+ P. y- t        // make data node in free list
# E7 I" C# E5 h1 ^/ w        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" v! u4 F! }7 u1 U0 l        server_msg_send(server, APP_CMD_LOG, "upp send: success");5 y1 F+ w1 M! A$ y( G  y3 j
    }
$ @6 {7 T( g, C% `7 P    return true;
& I5 ]  r$ N! l! [- v}
7 ~! R1 |9 k  y9 E- l' `+ B3 N% z; y3 b$ o+ f: p# B
& U0 P8 j1 P, E$ p  h7 n" x

0 I5 u$ x& f" X; m

/ f* t; u5 a9 n* D9 I# G
8 B( x: q7 V. E) L3 T( _

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐  [2 B6 ^* X( l+ D3 w* w

7 u8 R7 E3 K: y$ i

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 06:26 , Processed in 0.041076 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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