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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; b, J  B$ L; {, X! b

% J% `5 E' x/ y问题描述:2 e& g1 r! J7 x) E+ D
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
  O  [& {5 C' J) T+ I
* \: S& [- {; U$ k2 _8 M图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! {1 x7 W# N+ l, l
( r' \, U$ m- j$ X4 g测试结果如下:
% D1 K8 F3 j9 D4 v, d8 \3 g138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ n  K! @) \4 I- X2 C
# J( O7 N+ e2 y. r2 K
$ h8 z/ J. E0 `$ J$ l备注:
/ q# C5 m: ~% N) v1 J4 |- D1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
% B% ^2 n2 G2 u9 T
2、相关代码如下:1 O( |4 p, z3 e( e. A
//UPP DMA缓冲大小512字节
6 [( S9 @5 K/ o0 b- C#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; d" L$ F1 N; @$ K8 F4 W#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 w7 o& V: a' v& M6 R+ a+ C2 q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
6 [* p" a0 o: k- ]- O
! @( o( C: d: ]" R+ K6 W- {, c) w$ I& k9 R9 x5 c2 R& G9 G
//upp接收、发送buffer
: b* B1 U& ~9 J! v#pragma DATA_ALIGN(upp_buffer_a, 8)
: s, i1 e/ F+ [9 x6 W9 z( e#pragma DATA_ALIGN(upp_buffer_b, 8)
* P5 @9 F/ C5 T0 y# |$ _: }) C3 }' t4 F. M" B3 |+ ^/ ~9 y1 N& ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' [6 \4 o# Q. Y' gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 `; [/ \6 H6 f6 W) f6 m  J

& J/ v- y1 q" M; h. X
  x& Y" u) [: @6 E" v8 Z6 l1 Tstatic bool server_upp_data_recv(Server *server) % o; Y' u8 {1 l* U
{8 Z5 M! n9 Y) ^: G+ v
    if(server->upp_channel_a_recv == false) {
4 A  p$ u3 m* x  @2 q        server_msg_send(server, APP_CMD_LOG, "upp recv: start");- W. u5 H8 T  Z7 o# R( q
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" j7 s  a. @2 |" B, N0 k* R            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
8 X! y! R9 E5 Y9 f% B- \( C
5 B. L, Y  @$ |# \( }# u8 g3 K  ]5 _8 Z1 M& r  E. T
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);6 m2 v9 y1 q3 H

( H9 g# h5 J1 `. A9 e            server->upp_channel_a_recv = true;//
- G6 [7 r" {" P. U0 j/ X            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);6 }2 t6 ~# G' ~7 R. M' I' d. J
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 F" I8 I- f. _
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;  v2 ~" Y/ T0 }
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 v/ W/ W. U3 Z. _; d6 \6 p
/ c: e5 }  f6 z, }! |; r" Q& ~0 u. w
            upp_error_count = 0;
, [  m6 Y0 }) U5 n; w9 H            upp_dmai_int_cut = 0;
) o* D4 I7 C% L4 p+ x: H; ]1 e4 D( w! R( w8 k; ?
            // fill in data # R% _$ `- K0 g  L  x! E
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 M* q* L; L: I# f7 z  a, v            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");/ \+ X; L5 \7 E5 P% G
        }
" F& C2 b, g. H' r$ B( C    }
* N  o! W4 Q6 A$ V; t! v    else{
8 f# x  |. u3 T# X6 a  K        if (upp_dmai_int_cut > 0){! k( R; `# m. C. t
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
, e; ?( y. c$ J7 u            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 W) E% y& R0 u' X& z, \6 c* u
2 w+ U  `+ @% M7 @: P
& i  N% Z+ @) c1 F) o% w* T! S( g            //copy data to upp_recv_list_busy9 D; ~5 V+ x$ |1 S1 v& o* u
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 ~8 ^! L% j2 t  k9 v
) S$ p" _  z. p7 s7 h# k- b1 b            //* Q' M9 \, A, T. l! A0 a4 }  i. Z
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
- E. @' y* B) @- E1 K5 r% ~; \3 O$ H5 w6 N  r0 C
            //
2 v1 }7 p5 {/ p  r$ L$ G            server->upp_channel_a_recv = false;//
, h% _" F1 _) m% ^& k0 `8 r! |1 X$ [5 v8 j; c+ Z
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");) ^* p5 w8 L8 e7 S7 q- u
        }
6 r7 \6 d# S- Y    }9 b* g6 v$ F) w6 @

* @& h/ g+ [* r! z% w
% w. q' ]( l7 n8 }- R6 L; c    return true;# [2 H. Y  X5 Q' P- ?+ o+ b- p
}
  X3 p) ?0 ?9 k' F
, I3 r' w$ \* Mstatic bool server_upp_data_send(Server *server)! u: G8 M- \1 o0 L: U4 T+ p" }
{$ a$ u6 [7 q7 K4 e! e5 M
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
4 q! w* B! J- {2 |" [' w        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 K9 D0 L' L2 H; _3 `        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 K* }* B. r2 v        char tmp[128] ={0};0 d- p" O6 L# t$ z7 m* W+ |6 k

# t6 H3 A- N+ B$ S0 i        server_msg_send(server, APP_CMD_LOG, "upp send: start");
* }  B$ _" a6 K0 g% ]: a  |        print_log(server, data, 64);
/ w: T. f9 Q9 a+ J$ p' u/ B' ~" B4 C4 y( V7 \  r( h
        //" G2 @5 D% G( G* c: H
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. ^+ _: W+ V* x7 T2 C- r+ O        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
; h% M0 P, h0 w5 y1 G2 P        print_log(server, upp_buffer_b, 64);. l3 B- w% ~/ p; F" M# S
' K6 @  u: P2 \0 v7 V
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" k3 E7 j* w( O  g        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
# Z2 S3 E  H. W: \" J- }6 t        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
" ^  R1 A5 C0 j( K! v" G        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 [4 t1 G% K4 b# v
1 z( w2 w6 L: ^" _        memset(tmp, 0, sizeof(tmp));
5 @' o% j8 X. `: w3 e+ X        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 b- U9 E: _1 k/ O/ L+ U            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 y/ R* D: }% d  g5 e* x- Z        server_msg_send(server, APP_CMD_LOG, tmp);9 @9 k  W8 \$ f1 R; O: _
5 |9 v: T  T) |( o. ]. @8 c/ e
        upp_error_count = 0;( f0 ^; \( g6 w$ P/ y- `
        upp_dmaq_int_cut = 0;
" ]- N' h: K" \7 [8 S        // fill in data
9 i, w, }4 O! o, t6 J. d+ e        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 A4 F3 g# ~7 n. \) s. F" n2 A( z0 V% y! i
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" S1 I+ @! a1 o% p9 I; f5 f- |
        // wait send success
. e0 k  \  n' D! M: H" A3 a        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; a% S: _9 S( K* x0 r- o; {" |& ]$ [7 l: s
        // make data node in free list ) O9 a! O. R3 n$ p6 f& t8 p: J
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' Y; n1 ^6 [  A2 Q% T4 U
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
' `% X& Q1 E* M' I    }
4 ]# k9 r1 a& d: y. t# r    return true;% X( B- ~) p7 F. z! A
}
' Q- u: u2 l% u) i$ J, x
9 i- g6 A0 ]. w, w2 ~* o2 }$ B7 l

7 Q! U* W. l% P
! U& Z- l+ j9 z' I. N3 n' ]! X

  N9 B# L  f& ^$ Q( i8 K: P- B3 }9 m" p! u" C6 E

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐9 N: A" Q% B4 v. @- L# P

; O' v* K" q4 k4 ]8 V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 23:14 , Processed in 0.046963 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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