138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
7 ^7 I# ~+ x/ d  A3 |* G8 A3 t, S. i( {2 I" l
问题描述:
) K7 K) g$ L% y9 P* l1 @' x在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* {1 a% `! o- o% S1 I* a9 l) c
6 y8 i6 _$ z3 l! n! V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。7 E5 ?. D! e. r7 G7 z3 K, c, l! g

$ \; ]7 y3 A' x& ]测试结果如下:1 k; Z' j- Z6 O8 O* g
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 `& i( G: C* L$ B" I5 c0 A
- A. x6 G7 d) R8 m3 }/ t7 k
8 W+ Y* o# Q' {5 s备注:' `8 x% u/ V% c+ X! G2 m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 M4 s) L: k: }2 {  W1 Q% m4 j* f
2、相关代码如下:
9 i# ^5 d. v/ [- I( m% f1 x3 F( U//UPP DMA缓冲大小512字节
) [6 Z$ H' C$ T, g6 ^' p3 B#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- o+ u! I3 W& r2 _#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT- L1 n  L, w4 l
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( L6 d- M1 \0 e/ c

, d* a$ g  V+ Z- ~2 M: m" A, E/ r4 y, Q, v. c# \0 {, e( y
//upp接收、发送buffer' h: M: D, }0 L/ r1 a, a0 F! z
#pragma DATA_ALIGN(upp_buffer_a, 8)0 j( n3 m$ G0 i. O
#pragma DATA_ALIGN(upp_buffer_b, 8)' B, U# V- D% F( O! a) N* n

6 c% P; F# z9 v" Q2 Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 i; f- _: U8 ]- a3 C$ a9 l
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 f, A; R$ p- D! `1 A" e7 N. Y) Y* X* g% K( }8 Z* U

6 a1 B. J0 C) H8 P' [2 l! ~static bool server_upp_data_recv(Server *server)
1 b$ s6 H* U* s3 O{
6 W2 f2 V& ^5 }# s" Q' w9 l' |    if(server->upp_channel_a_recv == false) {: a! Y6 U* }9 G) m3 L5 \; k
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 U* s9 l' }6 E$ V        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
4 T% h9 n  c& @. Y( S( t            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 B, `; r0 J+ K* C
/ V. l! g8 P% d

% J. d; C, S( t0 ?            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ H( {# R% B. q
7 X0 r1 B" r9 p! l+ Z4 ]0 Z
            server->upp_channel_a_recv = true;//
- ^/ c: X9 t2 y! f/ A- s            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);: Q& H7 q7 C$ _6 \/ ~9 Y
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
8 C! O; e* e' c9 C3 C  l            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 a2 R" k3 n: C            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- H6 @. Y5 ^* m% c+ `; Y
7 P1 E! R3 N# @% S" b0 R2 x! m            upp_error_count = 0;
* q) [4 Y0 b. s* F8 L0 c9 m; F! k            upp_dmai_int_cut = 0;' N/ ~1 J6 R: \' J6 O4 P

1 B8 q# h6 _( Q: b9 k            // fill in data
1 a0 e0 v. Z0 x( S( H, h3 P. H$ p1 O            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
0 k3 q; d  D& p0 n            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 X( |2 l! K6 |- M$ w- j
        }7 u3 S* W! C. F
    }9 w8 ~. ~  _; @! w8 ]# y% H
    else{8 r( O) D1 P0 W/ Z& Q& _' Q
        if (upp_dmai_int_cut > 0){
& O% L2 R: E! W1 y            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) h: z3 u9 u; ?6 L9 D            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 Y$ n# e% u; o$ [' H, E$ O
! D7 Q$ I4 M1 w# w
& F, y. C: p' `6 Y# J" m
            //copy data to upp_recv_list_busy
0 j/ @) L( E. x' s3 C- b2 h            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 U3 D  N2 w/ I7 `/ J

: A& C( i, g* o9 ~, A' Q            //" c$ ^6 t3 z! i' F1 H% K, v
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 a5 ^7 U. |  ?' n

$ k7 q8 ?1 i- O, h            //4 `& T9 s- s. a, H- z, D
            server->upp_channel_a_recv = false;//4 }$ i6 O" W! M; l+ [
" K. G; M5 [1 k- q' s% E# O
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, [- E! F& L: f" d( [        }7 `4 r0 D( T* s% n; Q6 A/ p
    }$ Z6 ]/ W: \! B

. s- ^+ r. r# H# E+ L/ k& }5 ^5 S3 g3 l8 e" ^- I1 [
    return true;  H- l, M: S+ a+ r  A, `" m
}# C+ X! l8 c/ ^' ~

$ R3 H; _" z  K4 q; ]" @% L0 @static bool server_upp_data_send(Server *server)1 {, [2 H  J4 s3 x* N1 a6 v! _
{
' U. {$ X  h4 u% o    if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 R. C% e# _* |, }2 ]# C
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- p, k2 G- M4 ?) N        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
; S) b" I2 A! {  ~. q        char tmp[128] ={0};
6 D4 v5 |" L+ H7 S( c) }  [( j
4 c) u4 L0 Q: e        server_msg_send(server, APP_CMD_LOG, "upp send: start");
! K4 H% Z" V. c: {* t        print_log(server, data, 64);! M: S% P1 P, z  a" D! q

3 P. i: e, S8 w% f        //: i+ |" L) e3 P" X2 p0 s2 e
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" t0 m$ I! Q7 R7 B7 G0 K/ S& q$ j        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);$ N- Y+ s0 \: E  ~' j
        print_log(server, upp_buffer_b, 64);
. `& N: i+ }1 W! x7 v( V+ n
; E' W5 q+ n+ u5 }, T' y  K        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);" ?' R5 u7 b1 D7 n3 J/ Z. W
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
2 ?8 r0 e7 u( O1 b: v$ s( P        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;3 l0 b- {$ Y% ]) ~
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& v- A, |8 z, H. {8 n1 w7 ]

/ ^. P* i" P4 w        memset(tmp, 0, sizeof(tmp));
8 U( ]! o/ @& t% Q7 x' e1 o  }- T        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ) d' Q; V+ K1 X
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" d* d) L* w0 Z1 |5 m2 V
        server_msg_send(server, APP_CMD_LOG, tmp);
8 _$ @4 ~% |: ~; M# D
' U: p! q4 X0 k& J        upp_error_count = 0;
8 s% p2 f- d* P( K# E        upp_dmaq_int_cut = 0;( ?0 y1 z1 }3 n6 _1 A
        // fill in data
+ s+ U( |) ~5 y/ m' C; N. l- E        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ! O+ B; Z5 h  u) ?
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
; N( @" Q  J2 x( @' r$ Y! t6 \4 Z2 r: M  r" N
        // wait send success* l- D  A0 {# C* }4 @
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' Z  ]  D: s( z# _5 p4 [. D

, B. n; X4 y/ i* a& n1 ?/ m! E        // make data node in free list * g7 S3 n- E/ w( x) q+ u
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' s% Y/ g  ^: ?/ \        server_msg_send(server, APP_CMD_LOG, "upp send: success");
# C3 Q% U! L8 V& Z    }# I+ x, X7 J1 A. Q5 l
    return true;
9 b1 Z' y& s% e! J* T; C+ [9 Q}
! o: [1 N. V# ^- O7 P& Y1 F6 J- X3 S. g) F% C7 {7 H' A

0 u% m4 _0 ^0 l7 W0 b; n
9 V, }) l, s* _! s
9 q2 {4 c/ V) K
2 e+ B" p. ~: j% j

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: a# ~. o+ ?, |# D

  G( z7 a* X2 w" l9 f$ R* r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 06:30 , Processed in 0.039092 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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