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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
1 K: f( C' J' Y3 Z0 [8 l0 t* Z
( W) R! l9 V, u' M: u) W* G- M问题描述:$ E, q- T2 R% Y& s) G4 J& y
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 y& T( P, H4 b( o4 h0 c$ N

1 ^, q* y, I* |图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 g1 _3 N7 x/ r+ x  s9 K  t% W

% E3 ~  R$ E" }; F测试结果如下:; P% g$ j9 k& W. l6 p/ J
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
& x, x0 X$ \) E. D- W! Z* H: e' {. \; k6 r+ v/ Y) W, {

# c! l! S/ ^' v( k! v0 Q4 _备注:, c' ~& z: }$ R9 \, T' W) v7 G
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?2 N' Q& ~) y, E
2、相关代码如下:& ?  l" @3 c2 r% K5 }: e7 \( L
//UPP DMA缓冲大小512字节
) _, m( r1 C7 I% \#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, }) ^7 `; u) d+ B, g8 V  X6 a
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 b: G$ {/ |$ a! Q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ N3 C- e& E2 i* q8 T3 N3 Z& O/ B6 \: H" X
# p3 J* @. @4 P/ R* g! ]1 `9 U
//upp接收、发送buffer8 K5 G: f/ N) T6 Y
#pragma DATA_ALIGN(upp_buffer_a, 8)
" x- U$ O0 [+ |#pragma DATA_ALIGN(upp_buffer_b, 8)5 ~, k" S& p# _

0 w' Q/ W) c) \unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];  d9 j3 S5 F2 i0 t- @
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 O' I  ^: F9 R4 H0 [  a5 c
- Z/ n1 x+ A3 D+ t! C; n3 }
9 q, |4 r/ E. l6 {, T  {; l  W0 W
static bool server_upp_data_recv(Server *server) % |; O, T6 z6 s! q2 a/ H# w
{
8 D6 o7 K; I2 h    if(server->upp_channel_a_recv == false) {& K% t5 b* j. D, h% C
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 m. J7 B7 {, S, D7 l6 [& e
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
+ L) F8 A: N1 ~  Y3 Z0 S/ y2 v% _            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) H: i9 V  A; y& d" k% B8 k7 ]
' D) `; e$ V$ m4 [5 T) ^  q8 \: c8 m) W+ [. o9 K  H
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 `/ E( V! J4 B% d" B/ \  T- l1 X% ^% f( X' B
            server->upp_channel_a_recv = true;//
) S/ ]: @& r$ `) g; C            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);$ F8 x) G: a- F! G  O
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
' ~" J- F( a- U7 Z            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
& Y+ V0 P; {1 i3 S8 q( U0 R# z            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
, e7 Y0 `* F3 E  A9 w' ^9 g9 u% u4 B9 M  q' j6 V& p- w
            upp_error_count = 0;3 ]  H9 f+ O+ ^" Z: Y) O  T
            upp_dmai_int_cut = 0;" g9 z# S7 Y; T2 a8 m1 d
( ^1 e. L1 l/ T% ?
            // fill in data
! V9 n) O) Q) C5 K$ I. D( n            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
6 g% T! s( U6 f2 F4 d, R            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 L9 N% `) p' p/ O: s
        }
( w4 {4 n. Y1 l8 ^: t    }
4 b: A. P0 H: o6 {9 ~    else{
0 ^* ~, o& [/ A5 w2 ]        if (upp_dmai_int_cut > 0){7 y6 m) F! I- m7 `7 v
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 L! j5 }' k, H2 A2 y% b& R            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 \. A1 y  T2 o) F" d1 |6 |, }9 E9 D

' O, s* W$ y* ~
: ^) g/ S# ]- m2 a# G            //copy data to upp_recv_list_busy
! P$ e5 Z4 R: J" |6 o" \. ?8 T/ i            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
, H8 E- m9 a! `1 {5 y, r! E% x$ m7 K; t) b
            //) Z/ F# Z  R! a. `5 Q
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 X$ ~/ _5 z; x/ Z  l8 B2 }4 A( w

' g7 @. O* I$ }- Y3 t% C- e            //' }. \, p/ j* C1 C: q" h
            server->upp_channel_a_recv = false;//
) q* G7 {. ^3 ~
+ `+ g9 g1 D5 M% \            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
/ s6 j: a, j; v" N. h        }8 \8 m6 q( _2 v# G( a# J- n1 p" U
    }6 G0 p7 Y1 y+ ~: c
6 ]9 h6 t" E6 |4 _
1 _& b' u, K8 D. E" y- T) Z
    return true;7 |* T" L$ ]: e% D% ~
}
/ F: f2 H: W4 Q# S9 p1 |7 M4 ?1 T1 P- }) F0 m: H4 M
static bool server_upp_data_send(Server *server)# t# {8 a& d/ J: |
{
0 |3 S0 M. ^' X+ m; \9 Z% i7 L    if(ListMP_empty(server->upp_send_list_busy) == FALSE){1 U$ D9 m0 \1 r# t) e5 f
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ ^8 B" e1 m* L+ w. L" g9 j9 V0 k        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);4 ~, `, r& H) w% A$ _  @7 I4 C
        char tmp[128] ={0};' o* j* V; o& K/ K$ t# p

+ B, Y8 G# k: J6 q        server_msg_send(server, APP_CMD_LOG, "upp send: start");/ Z* g9 J+ j  B$ m& F
        print_log(server, data, 64);4 W& r0 s( w4 Q, o- q& ?( F
3 I5 s( P. T% C, Y. n
        /// v' Y0 U4 u% [, B, U
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
& R9 S& F8 i3 Z4 n6 z: l% b% N/ L        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 e; ]9 R4 |0 d% ?' Y
        print_log(server, upp_buffer_b, 64);
7 H/ _9 m6 L& |/ v; K
( V6 V/ M) H! i/ c( A: v& f        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);3 N5 y2 O2 y6 b3 D
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; # {5 x( ?5 K( b: ?4 Q. g
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;. U9 B! p" Y' g, w
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% Q9 d6 o- ~  f, W# n4 B4 Y! K4 w
        memset(tmp, 0, sizeof(tmp));: g/ b  _. G, M# z) I
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * X1 c, w# y& d" T0 U
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" R) g& x. K$ [; P: m8 ?        server_msg_send(server, APP_CMD_LOG, tmp);& o, ^( y9 t, V! `. O  q6 x

+ s* `$ @" K, j* z: ?        upp_error_count = 0;- v. k4 v$ U4 U
        upp_dmaq_int_cut = 0;
! F1 p$ V% l7 r! x' `        // fill in data
1 D' @( p3 V% y        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 6 s& C# c+ n$ o; h
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 k7 K9 S; m- b- y

/ K2 y. b$ W+ q: c        // wait send success
, |' n( Y5 l6 [- u% y; e! B        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 q. u9 T6 g0 {8 {1 `+ ?
( S/ K1 W! U, x! L+ |- n% w
        // make data node in free list
, s# z2 o' r  B        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);" c  C4 e8 s6 \* J: l  e
        server_msg_send(server, APP_CMD_LOG, "upp send: success");* M, t8 u% P0 x4 V6 ~3 J# a
    }
2 j# H" H8 S, ~3 {    return true;  I: M+ b, i) O* n) r  c, Z
}
; m9 K. @( Z" Y+ w9 z* X3 {' I3 ]6 T& h! C, U

9 T9 _. N/ @2 c
! `% G; C& C3 r6 x& I: S
1 @, ~8 c4 A" P8 _, P2 R) `) {

* S, k  G) S. r: s2 r3 Y, p% j

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- u( a4 I% k1 }; S0 O
4 o; u9 _+ d# ?% l% s% _, V# H

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 05:51 , Processed in 0.047856 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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