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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 O4 ~: U* a5 \% k
! A! n- I& Q$ V( k  a/ ?8 g$ s* _- T问题描述:
3 \( V' V2 r$ t* N! p在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 q, ?3 G2 w7 E  _# I

/ b( J* c" D0 k图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# ^' _8 R, G/ Z  i2 g
5 A! |, h7 w; m4 ?测试结果如下:
9 ^( r$ [, N; g6 ?# G138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?7 n6 f# C( f3 d5 |1 x( v7 s

+ J' |  S( Z$ q. A  U% L( Y& {9 y
% n8 l% E5 j4 @6 Y备注:
) \5 q$ W( ^+ F2 f& k% @  C1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?, U- L( m1 h% E' o
2、相关代码如下:. ]2 k6 {8 S! Z; ]- N/ S8 F9 P4 G& x) ~
//UPP DMA缓冲大小512字节4 f" F. d  l' N' Z. A8 }4 ]
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ B9 E0 g, K! k#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT9 S$ O7 L" E& t; B1 a$ x
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)% R  P9 J8 T" ]) A2 p9 t6 F, [

/ g! q' E! X' T3 y. _5 {( E( X+ Z
//upp接收、发送buffer
$ Z5 F5 {4 X5 D9 s4 S" a' ~" _) r#pragma DATA_ALIGN(upp_buffer_a, 8)8 i( C0 M' M  w. A
#pragma DATA_ALIGN(upp_buffer_b, 8)
; f; Z, \" |2 v, |8 J) w; d* o! B2 [) t/ H3 R) e5 T: L1 a
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 V( i$ K3 |: S7 m" A; _4 {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];7 a* l6 g0 L6 H; K
# {2 B/ O) d5 y2 Z, l# E5 S

. u3 M1 T. ?, N6 o7 ^# Q3 Sstatic bool server_upp_data_recv(Server *server) 7 v. @* F" J# t
{
# O4 D) I% d8 b    if(server->upp_channel_a_recv == false) {, g+ l, [# U  n  `0 }; E
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");6 w+ k3 W3 H9 V& u) b
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% q: Q4 V8 @, F9 R5 _5 S/ D( O            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 b. Z( f8 O6 t" i2 h! G4 V8 E: N- r' a+ c
" ~0 P' m- s( P$ N
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ O3 o! l5 {% M; R: `. _
4 P8 l9 S$ T# @, G            server->upp_channel_a_recv = true;/// O  N. A5 [, b  a% W- o
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
. c$ e2 p1 d% A0 X2 _2 P: P            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;, y; @, {0 V$ `8 _
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
% [6 H; i! Q: e5 B! r            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//& C4 b0 T) A# ^! p, x
" N: z9 y" r) }+ e# m; N
            upp_error_count = 0;! z) `+ s' B; N) j
            upp_dmai_int_cut = 0;: m. B( q5 R4 c+ a

6 c- Y6 ^8 p- Z* v. H9 p            // fill in data 2 z" G& W% I3 z  }# S: m
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  L) P! J- |! f8 u  l' L$ h% |0 E2 t
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. S' [5 ~, Q9 p. D" C        }* j5 {4 g( `$ ]! _
    }
( D& ^2 L. ?6 H( Z( b1 i    else{+ w% G/ |' g; p3 r4 R* M
        if (upp_dmai_int_cut > 0){
: l1 C& X. k: ^' S/ @$ z4 w4 s: n$ H2 a            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 Z5 N4 S2 }; Q2 `' w
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 `3 ]2 w6 X7 N# b' d( a. p# h4 D/ E# R3 s2 i' U) c: o& q
! E8 Q* {% |$ i! h, o
            //copy data to upp_recv_list_busy
7 w) Y! Y4 z2 j# v: Y( d" [" v            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, H) t# K( ~8 H6 I8 Z  k
* h4 G2 H% e+ H  i  h5 x0 T! a9 ]
            /// l  z3 j9 b" [+ s# @
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 \( ]" @7 @8 m

7 ?  o3 W9 d$ }  u" r. _  r1 G: O            //6 S9 _* ]9 Z+ v2 X/ L5 s, s
            server->upp_channel_a_recv = false;//
; _, R# I( c; m0 ]9 X) H- Y: t7 }  u7 w
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ l; @% N. y% F( `' J        }
# E4 h5 g% P9 V    }
$ P" h3 ^2 C9 e! u; T% I8 n; B( o, k0 O; Q

( t7 U3 }1 C# ]/ H9 P! k    return true;: c3 E  B. e6 ~/ `* T) y
}: D, ]( B( V3 p% X& r3 @! q
5 [9 t3 D" e- g4 q4 R2 E
static bool server_upp_data_send(Server *server)5 @, w* E4 ]& \$ l3 z( q4 |
{5 Z, P3 y: E- d5 t
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: e6 H( d" }+ L7 {, G' X4 D% D. ]        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 T. o+ J3 p6 d1 J) a1 f        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* W$ E. L9 M# d4 e2 j        char tmp[128] ={0};- ?8 q$ I$ ?; ^8 Z

8 t0 V8 j2 r! r/ d, n1 t: f" |        server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 l% R* I7 \% X$ S: i7 i: K3 g        print_log(server, data, 64);
5 ~" H7 s, w! f* o8 y4 U$ m8 I. M
% ]+ _  L2 V9 [" c        //5 s+ p- a5 s2 c: ?3 s
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- L8 o/ T; A' o  y2 M+ Q        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% m7 q' F( M" H* p' I, J0 k$ j) \        print_log(server, upp_buffer_b, 64);
2 s! F. w9 i% Y% F$ c: O& @% X& n8 T) x$ F* j# z
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
2 y4 [0 A9 X3 {        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ; ^( x8 c3 o, [: Z$ n% b, E, F3 D+ ?
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;9 Z/ n9 v3 ~$ i: Q  C- C' ?
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, ^, c$ q# @% c, O) K8 k$ `8 W& j8 X# \
        memset(tmp, 0, sizeof(tmp));
* {. P! p- K5 E. v$ m" O        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", / T( _0 P9 v: B8 G# [) _
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 i1 r- w+ Z2 A# {- G        server_msg_send(server, APP_CMD_LOG, tmp);- w1 v& u+ U/ q1 s2 D4 P) }6 L# Q

- X3 }3 n/ b9 L        upp_error_count = 0;
' u) a$ G. \: N9 g* t! n" Q' m( Q        upp_dmaq_int_cut = 0;6 ?5 V- {/ W7 Q4 `, a
        // fill in data
+ l- ?% {8 W8 g  D3 |+ }* r* o        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 q4 s) D+ y& n. }4 i1 v
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
. u- l% B- _* @$ ?+ P" \
3 }0 q  H$ h) n/ q! P; v        // wait send success" T1 V; v; I5 Y- x+ t& v
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   h1 u7 S& s+ O: |0 h% ?, }! e
& }1 Q/ g8 f- G1 A6 N: E- K
        // make data node in free list - B/ }$ ?! h' h: ^7 [
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);+ f! h% u4 G) n. Q7 A" J
        server_msg_send(server, APP_CMD_LOG, "upp send: success");# d, n9 h; a! f. L3 Y. T
    }% i: `" v" g: M1 s
    return true;9 R6 i- ^, [8 p' M+ Y
}
" e9 |5 X5 y7 P7 p( E8 M( R: s. e* ]0 G% }; I7 \
! K! i# f) \% G: ~9 q7 l8 E

+ _" Z( S8 b/ l4 |& W$ t3 A' v
* z0 {! P" N" |$ B. ~. x1 M4 Q
; S' k9 v6 C; V) u5 R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
% k9 N- N5 I- W) W3 [2 p: {/ F. u* m3 Z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-9 11:13 , Processed in 0.042746 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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