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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' t* b2 \) X9 S9 E
! {" q! f6 B! G  P2 }7 W, J
问题描述:8 q& f9 n$ @: w! @, b  s
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ j" a2 t7 Y7 O* E4 v7 X4 }1 g: h; b, `5 q& P  p! B
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
( _& r$ }0 f8 H( |, Z* ^0 P. Q  y- w
测试结果如下:
2 Q0 \1 m. O7 l8 A138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# V: s7 }  T* u2 t9 U; m1 s/ K2 |0 u/ [+ {- v

9 N# _8 }( T8 G  x  ]. a& I; m. d$ Q备注:0 Q% f/ U% P0 {0 w9 D3 ?+ b
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 p5 L# _' C! ]3 y  k
2、相关代码如下:
& r* ?- m- ?4 l0 d//UPP DMA缓冲大小512字节0 l9 A6 x* X1 |7 E9 Y, @% `
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
$ J$ J2 T* A  U# ?+ H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' C6 V2 P3 P3 S! S7 a- a
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& N) ~0 ]; u+ d) J
8 c7 c$ g$ F9 L/ T

; k, y+ S8 ?/ B% Q& R8 D. i//upp接收、发送buffer8 d0 b5 }' E4 E. h# g1 B  A
#pragma DATA_ALIGN(upp_buffer_a, 8)
& d" b5 Y9 e/ f2 B& y( Y) r#pragma DATA_ALIGN(upp_buffer_b, 8)
# R. J  a  m+ U, Q) f; y. V' C" u" B  ^
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; u, |$ `0 s! A; eunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 n& l# G* A4 p* g) i: z8 w
" U: Q1 d! V+ ~3 I- _" s) c+ f) V; ^9 N
static bool server_upp_data_recv(Server *server)
/ \* R" x/ A3 }  P9 d{
3 ^7 ?/ T$ ~* t9 c    if(server->upp_channel_a_recv == false) {7 N& P6 E5 @$ u. w
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# G: w9 X% C) E. E        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ Z4 l5 p. W* Z, [
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( Z0 V$ K* B1 u8 I: E0 M9 ?0 {0 r) S$ c8 f4 \3 K7 J7 l1 Z+ J

! @/ a" D7 L- p. f- _            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 ^% z5 s8 O0 u5 v0 [
7 v2 E% O' J' c% ?$ b$ G3 U( ?5 _, E4 l            server->upp_channel_a_recv = true;//
) \- q- m% Y7 I! L" W) S$ O            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
% _+ Z: k2 \2 ?            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;' D3 _8 O9 h9 |; [: A; u$ T- m
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. @- n0 Q. r8 S8 b$ y) v            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: z9 ^7 t$ L$ A2 W3 c4 ]
; H  x; X2 C% V: {  ~5 ~            upp_error_count = 0;2 n% ~: u  p  l( P, b2 F$ M# R
            upp_dmai_int_cut = 0;3 U3 @5 N& e$ H& G( n9 w1 g

0 n" v4 \  w+ J. H            // fill in data
. o8 w' j/ X' x) ]" |$ |5 ^& ~            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ B3 G0 d4 c: e* \+ P
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 a0 O0 S1 [; z: l5 K        }
; a' c/ q4 B. P3 Y! w    }/ y" @: x% w5 \0 t) |* y
    else{. f6 j2 F$ T& N6 T- v2 E
        if (upp_dmai_int_cut > 0){
- K0 n  k1 P$ I( ]* g            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);2 I9 [; R$ d6 V6 H& M
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" l* J) O. [' |5 }9 a+ e" i# O. ^3 G" [8 N

0 l/ s1 v8 S7 i) H7 F            //copy data to upp_recv_list_busy8 z1 y+ S4 o0 e/ b
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
9 j9 I. N6 R/ T% s/ S- b4 Q3 \5 N% u9 K! h- o/ R: K5 C7 i
            //7 c) F  B- }5 q8 D* B) r! ?
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);* ^5 y2 t2 `! u0 T% Y& u+ \. t

& l4 t+ Z  N8 X$ T- B! _% `            //; k4 b% a3 X; j( d+ g! M" C! H$ L9 y5 f
            server->upp_channel_a_recv = false;//
* ?  c# X# {! L8 a" T8 `9 W: d; @! w, Q
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
0 [! l: {  t# Y6 e        }
3 H5 E, x- I% m* m4 a; n: P7 m3 h    }
' s4 C' o+ w  i$ u5 ^
. }! X8 A" _7 @, a# K8 ^: _
# R5 X2 A: N( f' Z7 b" o" W    return true;
! N# ]. `- x% Z  o! k% G4 `0 T- R}7 s! O% m+ \$ P7 l2 }
5 m) P( t/ g2 [! ~5 t3 Z0 r* a
static bool server_upp_data_send(Server *server)
  A" |$ e% F+ Q6 _. G: ]/ s{
& r& y3 ^7 U5 q3 v+ J1 M, O5 Y    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! i. X# e2 P* E) Q% y0 d- t. ?# K
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);5 z0 S" Z; ]* t* y* J0 V# y
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 p) T+ \. D* x, z        char tmp[128] ={0};' ]5 ~, S" R- ?4 `, i

" z$ c. H' p1 n5 @8 z) j        server_msg_send(server, APP_CMD_LOG, "upp send: start");* \. L7 R0 b* B0 s
        print_log(server, data, 64);( @- \+ T: N9 u9 k9 d3 f
0 l* j2 a+ h$ ?5 c1 `
        //
! Z- ^7 c+ M2 C4 E        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ y6 [7 }7 O$ d4 P) N) G6 q* y: L6 A0 k6 w
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! O1 H/ `$ t' i0 R$ E        print_log(server, upp_buffer_b, 64);2 Q6 A2 Y( y) F- c

1 N  Y  M. D* |        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 Z$ C  H  u) l% F1 R        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; / m6 W8 U5 T- p( u+ b; S) J+ j
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! p( J1 i  [1 I9 K, A! F8 k
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# t/ a# O4 v/ v+ o6 |* I
1 Y* u9 x7 S0 f! Z: p8 x3 K& Z        memset(tmp, 0, sizeof(tmp));; a& I' @  E" ]8 W7 X! r# k
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) J* `7 }% e4 h2 Y; U; v            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 L. _" Q9 G3 g/ e: s& {0 B; o8 d
        server_msg_send(server, APP_CMD_LOG, tmp);4 ^2 ?3 O. c+ m. _/ L3 @

# h$ U& R/ m/ P4 z: g        upp_error_count = 0;
1 t: ?( ~% |( j2 z        upp_dmaq_int_cut = 0;
% R5 x: m& _! l        // fill in data ) _4 Z: R" |. X5 o! j, X* y0 O
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 2 q' M# {6 i) W& M4 [3 ^7 }0 H
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 C; h  w) f- ]/ U2 G# v0 U$ ^$ e3 l7 Y( f/ r5 }
        // wait send success6 `! t5 @5 |# X
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
. z) j8 V" ~& S3 n7 i) T1 D
  `& Z' U5 U$ m5 g6 r: X* E        // make data node in free list . D% D2 r2 E0 Q' y2 \* N
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
& h# B/ k5 o: F0 Q( o+ f! ^        server_msg_send(server, APP_CMD_LOG, "upp send: success");' m2 d) T+ v/ V0 ~+ k* i$ z* W7 l
    }' [( x! g% Y8 B6 C& T  W' B2 o
    return true;& J8 T: l$ [" v) H% M1 F. B7 c
}2 l! `; V' W6 x3 S

( Y; z2 a; ?! g9 h$ Y1 _
7 z, O0 X* d6 l4 I$ Y5 }
; g* a. z9 A9 B, q$ n& p# m7 Q+ O
% C3 @4 N) T2 r( b5 d
; w5 _1 a3 d  U+ E  V3 c! D

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
) [( \5 C7 L4 a2 j; M! _/ |6 r7 L! _/ w3 L* {- P

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-9 10:50 , Processed in 0.043704 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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