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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
0 x8 b) ^+ y' K7 ]# C
7 _& R$ I4 [" T2 a问题描述:
% h, A: d' L! {6 Y% \, S在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. }) R: J2 E: d2 ]. T/ m
/ s- u, C: N8 h+ h: X# C3 c2 I
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 \4 f; I; E$ Q4 {( C; Z

6 a* X9 Z/ l4 N0 t6 r测试结果如下:
; b- I% q9 }. B0 Y  C138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ O6 P4 b- O9 |0 B$ }! Z! B( x7 J7 }% r/ j# o7 }* H% `, ~
% B" q) I/ g9 V6 _
备注:! p4 U/ \" {" p5 n$ o8 E4 l
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 Z* W* q' [- R  R- r; h, K
2、相关代码如下:  O( ~; u/ y* _! z
//UPP DMA缓冲大小512字节
& h9 d# l& ^$ a7 e0 R' ^/ x#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 P8 P5 _1 C( w5 @+ C' E3 E
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ F0 b, P  k/ u2 |' Q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& s, D# V5 I  Q! s
  R& E- p1 M. G, r% S8 |3 m0 d9 ]( x8 \6 i2 C( s
//upp接收、发送buffer
$ d2 X- W5 j$ N! e1 }#pragma DATA_ALIGN(upp_buffer_a, 8)
2 P; k1 o4 G& Y7 X9 v7 ~#pragma DATA_ALIGN(upp_buffer_b, 8)
* _: K7 [' c' M) @  G, U7 |' V9 A3 a' a$ u: ]
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! T, w6 [! ?- ^& R% [3 ?3 Iunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 A6 ^$ R) S, f% o) w" a' i* |- T: Y. m1 `- A
/ s7 @+ f9 d$ N8 H- \; l5 Y
static bool server_upp_data_recv(Server *server) 8 N3 a1 @/ X" p
{
' X3 E, ^; r9 }# D- M1 j    if(server->upp_channel_a_recv == false) {
  [) J. ]6 O' [1 u        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% B; i$ a8 w0 m8 C* b* D" f/ r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 ^$ w5 w3 v' M; j  W( N3 `
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 X# Q  M( e) z/ l2 @% }) N2 _, I" z- e
( y, g: w5 Q+ Z
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
2 P8 E9 v" B0 D2 e) y
0 |( D( ?* @( W& j$ m& \; C            server->upp_channel_a_recv = true;//
2 p, y0 W7 X! a1 ]% @            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);7 S: D1 i( [8 n0 z' r9 R
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;* L0 [: Z0 E, x8 d
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;, k# d3 @, j8 D9 k7 R0 S. N
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//3 a( M  f/ Z3 |3 n1 a% n% H
) E. _- L- K: ~) a
            upp_error_count = 0;
" p) D; W% {9 j  c  c! L            upp_dmai_int_cut = 0;# Y  \9 b% S7 Y/ c+ P4 n: O0 v

8 b/ j. \# v* e$ T9 ~, |& X, U            // fill in data
( B! f" {( U0 q7 U- R- i' v- \# {* c            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. Q% ?4 L( N3 D: Z
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
3 v9 N; L& j! N. x        }* u* H" A6 M8 W9 j5 B% H+ V
    }& L, X8 g  o5 M6 }7 X
    else{
  Q5 ^/ g+ G# }        if (upp_dmai_int_cut > 0){5 w) `4 B" J* k( W: A, i# ~
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 I8 q% Z1 ?$ G/ w, X' {: F/ i1 z
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
  @4 p/ G2 Z  Q: u7 M
6 O3 A8 z% x/ |4 o( u  J" c: |& @: V" q1 h( r  K, x9 k
            //copy data to upp_recv_list_busy
0 x1 M) |* Y0 O: R3 l            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);' }: w  m1 Q; ~
) B' Z; A( ]( g- a
            //
1 }5 F8 M6 u* p            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ u$ g1 p2 C' F, O+ c
" f0 L3 F! W) N. S
            //3 [! G( Z1 t$ d2 c" k0 M
            server->upp_channel_a_recv = false;//& O( z$ C/ R3 v. y/ h! W) ]/ k: \
8 j1 g' j8 P3 Q  h( ?$ n! ^( z0 I
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");9 z' M4 r: b+ e% \- O
        }8 Q- [1 u7 q' B6 o5 `, X, a
    }
( p1 s# _5 I6 d% q  Y' B7 y0 {- H: ~4 @! g: O0 q+ n. x

9 i& M: E* U* m4 a    return true;" O& `6 ?9 Z9 Y. X. y
}
8 L8 A1 f* `$ q$ o
1 ?: n* \8 f# b* X( n; F+ nstatic bool server_upp_data_send(Server *server)
. a4 B3 d) X) P. b( S9 w8 s{
9 W$ Q* F: A  L- Q" v" _% F, l    if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 x- C# s- H( V' y
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# Y* w1 W( v4 D/ A. Q: [) n
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 V: U& v, I7 l5 c
        char tmp[128] ={0};
+ d" n' O$ S1 ?& _; K1 p" A& P$ \& p' }) z' F3 ~, W! p' x
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
# v, R' S/ T( |& |& @! C) f        print_log(server, data, 64);' f) Y# U! d! J* p5 D
5 i% s( t& e1 k; E5 }
        //
9 H; z; f1 K8 u7 H9 c5 T, p% s        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);' z% ?1 `  C3 S: l9 g
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! U8 t; g. |, c! g        print_log(server, upp_buffer_b, 64);
5 @. ~! P4 ^5 d( t: B
0 q$ x/ o# m1 B; k* _5 @) c7 v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
( M1 R8 I" b' |  a! d. o        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ; p  e; Z- V  a9 M6 E
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
7 k! |  Q1 z* U5 m4 y: {        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;0 ?5 J. ?  F# b- F0 }! [
6 W0 _. i( v; \2 L+ h# H3 q  S
        memset(tmp, 0, sizeof(tmp));# I9 Y8 G9 I- C& Z2 w4 l1 y
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
& F/ ]+ X+ v6 A4 J6 o5 s            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: w( T4 x, f% m& B6 n) i
        server_msg_send(server, APP_CMD_LOG, tmp);
) R) _0 A9 w' G  M# |: D; {6 ?0 C6 H+ H# c- G4 I( M, n7 d
        upp_error_count = 0;- X  k$ j) u8 d; r' S( Q+ Q
        upp_dmaq_int_cut = 0;
# Y" x% G" F# C, ~7 {        // fill in data
$ ~) P0 H( c1 k; w: B) u/ w( T        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % C4 |3 C4 }' r& j/ a8 `1 l
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ Q7 n8 \5 U8 k7 g  M8 I$ d
- h: _, _" L: }5 S' f
        // wait send success. L# \8 e; [1 D9 S
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : S; \5 ^# c7 Y4 j! }6 F5 ~3 c& P
" G# X3 b% S2 \9 d* `0 b# B. o
        // make data node in free list 1 m! \% W% `6 w: J5 \3 ~& g) W
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
0 U/ \# t0 k% h. a9 z! T2 O        server_msg_send(server, APP_CMD_LOG, "upp send: success");
8 g# }! i8 I" e- n9 O3 W( o  L    }
; @6 H$ q9 e+ c- N0 z    return true;
2 i* @4 B1 ~  n) a* u}
8 O8 z; z# R! {4 t
( ~$ Q' V+ [& U' _) Q8 g7 Q

& J, c8 t. X% e/ E) K4 j' V! o( ^) e
* Y6 v. o8 h! t( i3 E7 M
! z/ i4 M+ Z) v5 G) ^

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
6 l! V$ a4 R* R% Y, a* p( k7 a) o2 L6 P# U3 Y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-18 15:05 , Processed in 0.043104 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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