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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
; i6 ]. _' o  P4 k& I+ G! ~: M4 `$ U: [+ w! y+ ]- T( V6 }
问题描述:( ~, J) y9 q: \% ~: e
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' k, {' N+ b  }; k" t7 Z/ Z3 |5 q8 W8 o4 @/ b' O
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
: X& f! }# o" `, }8 l3 h% Z( X6 p
测试结果如下:# P. j$ ?* u" ?
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. `; u, J2 w  m/ ^( Z& H, c7 N6 ^8 W, t
' t, L, I0 x3 b0 O$ ~2 I
备注:2 I% {2 y  w( P" [! @0 Z4 b: E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% q$ P& u7 b( ]7 _( g: s) T
2、相关代码如下:$ C# P+ t& \1 m4 C* E, v
//UPP DMA缓冲大小512字节, F- e) D0 Z  }9 ]/ p8 ~3 [' J; i
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
0 z+ x5 X( X1 Q! ]; Y/ p/ X#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( Z+ K/ h6 j1 L) y1 X$ k6 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 I- {+ J8 p3 I# w6 M% Z# ]
6 o4 n' @/ E/ v% }* G/ o$ Q& p$ c7 D. M' L8 X
//upp接收、发送buffer
' D( j3 \" y) c#pragma DATA_ALIGN(upp_buffer_a, 8)
7 B9 g! k$ V: s. X; S' m! e#pragma DATA_ALIGN(upp_buffer_b, 8)4 @0 U) N' I, b$ A

3 T+ E2 \1 z& V/ ~- s) B, Junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];% H3 D: \) ]7 P; k
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 d# ?. @6 F. G6 f

1 F  @' [% m1 {  p: r" d
" m8 A5 s! }5 z2 x: Wstatic bool server_upp_data_recv(Server *server) - d2 G1 z/ ^  o% {$ y6 i
{
5 N$ |" g6 R- a1 ?    if(server->upp_channel_a_recv == false) {
' ^* ^. x2 j# n7 ^0 _: O        server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 u) b% P3 H0 r* n; p+ l# E9 N: Y
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. v6 \1 O9 V5 J
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. v! E7 }' r3 w) C3 {

6 \, ^2 G: m* ]. m: p9 m  S7 N: X- @1 u, i3 _. @" N: R
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 Q2 W9 v4 P% k+ P. m7 C
" G7 h2 _2 N& _: w' y8 y$ @            server->upp_channel_a_recv = true;//
& M& K8 M) a- }6 d            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);' L$ r. ~/ j. E# f3 R, ~# t! E$ o
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
# c. z3 I# I8 l9 N            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
$ I  |. V8 @2 d5 J, U            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* }/ s6 T% z" ~6 g/ d3 J
/ a/ j" p5 P3 D4 h; h( e* m
            upp_error_count = 0;
- T- H9 M+ c. l4 ]) k, d+ j+ R* Y            upp_dmai_int_cut = 0;: v+ S4 X1 s! m! |; n$ |
4 M2 [+ o. H3 H/ k8 C: v
            // fill in data $ N' _9 V  O5 z4 `9 D+ q2 t( i
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% q* `. u8 p. i            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* T4 L2 s- c/ S1 h
        }
/ n, {* Q4 I2 c' j( v! g+ h    }7 o7 Y) [7 C- q% T
    else{( s+ u" ~- o$ H( _& L7 x/ h3 G
        if (upp_dmai_int_cut > 0){& C8 q; g7 ~" ^4 K3 [6 Q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ W" X0 L0 t# F7 a            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);! E  f4 ]- f1 \$ L1 k9 `2 L5 j
3 R3 D) X8 G' t0 m% f
* f/ d+ U4 K7 }! D8 y
            //copy data to upp_recv_list_busy, [$ B8 Y# p3 X' X; a& k" Y0 u! \/ J
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);5 T5 Y$ F+ b* B) t, E& b5 R9 o

1 R- y9 k" O: N* R2 e            //0 D5 ?+ J/ v- g/ X2 X
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
+ j; Q1 j0 x) h4 T, c! H! r2 b" e% d" j! z. s, E# b# [
            //
, e6 _+ @+ d3 R* u  r# U) `            server->upp_channel_a_recv = false;//
0 J5 {& t" B" ^! U3 k6 y2 _+ {4 r0 B" Q" l
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 P: U1 ?* b$ z. B4 K0 y% D! q        }, F5 W7 M$ h) }9 s  J4 e
    }
4 Y; B* U1 t. m% D- D5 c
! @& ^% S% ]( i
2 @+ B! o! L* \3 T- A' a5 k    return true;. t! Z, j2 j( z( G7 i
}7 k, K$ K+ T- K& P' m
$ ?0 ^+ k8 g' K, r7 H! W% Z4 \
static bool server_upp_data_send(Server *server)& E, ], C+ V) E/ _) j' t  t& J
{
% t) Z& Q0 R1 h( Q4 S8 N4 b. b& f    if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 c, w, F5 u9 g7 _3 G! L# P' x! `5 V8 ^( h
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( L1 W, u8 T- \2 t. o' S
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);* f) F% X! n/ [8 W
        char tmp[128] ={0};( X1 x; Q9 j6 S; M9 D  y; M* Y
, ~' D3 o: p. w# U/ g/ P, A* Z
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
$ ?; H3 K7 B9 ?        print_log(server, data, 64);: o* W7 h3 A: W- ^  C
- ?- Y  g) q! x$ g, c5 e  g; g  g
        //0 m- y3 V, g$ n) t) p/ ^0 c
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 b% y; d9 c/ I" v5 m
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: F( @- v# V" P" v$ \& }: k5 D, i- l5 G        print_log(server, upp_buffer_b, 64);+ u6 e5 O2 N5 p

: @( I5 v- E) {- Y  t        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
# E, V; t7 L8 b5 I: v        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
0 q% }& X0 [2 q% W# R- W! s! a        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
. s* V) ~& F4 [/ B/ w        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, ]* t- h. k1 V0 v& U
- e& T; Z/ `3 C4 n' K: W        memset(tmp, 0, sizeof(tmp));
) |8 O9 L9 E: k4 i( V! E        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) I; ?; }  p& C
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! y- U9 C# {" R2 e3 Q6 T
        server_msg_send(server, APP_CMD_LOG, tmp);$ Q- }0 {$ a9 U$ T  r$ h

; C2 @7 D' L' k" L        upp_error_count = 0;7 A: \5 S: t  P( _' l8 \; u  N4 L1 v
        upp_dmaq_int_cut = 0;, [; b& g( d- C, F) U
        // fill in data
% d; o- ?- \) e; R1 M' `7 N        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
' R9 c: V% D( K% R( m2 o3 }        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
# c7 S6 v0 a1 i  N4 R
% l; m5 Z, T: j) ^+ d        // wait send success3 o1 P& R2 y' o/ c) b! H% K
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " W1 i& j( F+ K7 k2 j

3 I: N5 O) x' {' L0 L- }8 m! Q        // make data node in free list
9 C! e9 Q. P+ m% F        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);$ \6 W7 {  n* Z+ _1 Z$ J
        server_msg_send(server, APP_CMD_LOG, "upp send: success");5 v, m1 q0 [3 ~, f+ q- M/ V
    }
/ q+ A* i* S9 P3 m' _    return true;" _( \1 a5 E$ u, J
}) e& Y- Y7 D  V$ Y, j. f, @

7 j8 R# ~- f+ }# |! M

5 |! H! _' n+ r; [$ u- Y0 f8 J
* b2 p+ h; l+ C( D
3 ~, o( |2 R, y; ]) w5 T- q. J
! w8 E, ?% @8 v& i

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐/ ^, M2 S2 Z# s- p6 T1 q
6 \/ i% |( f  k3 e. Y; j! t- @" }

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 21:58 , Processed in 0.051429 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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