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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
! H5 K4 P; H7 S% I, z4 Y
2 y) U1 y' V! ]) V3 b! L问题描述:& ?( w) n$ z; Z* K2 G8 ?
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' |) O) f. U2 Z, H5 q% M
& E7 d& M" V( D+ K3 k4 c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 P! D- w( P: p) f% ?* T! t

' @1 p7 p; e& V  J测试结果如下:
1 z3 P+ D, ^1 f138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?! C5 r! t2 l0 V0 B8 ]9 _% `# A
' K6 z- f* f) d1 n& A" g$ `
8 Q; n: X' f2 l" E
备注:
6 u: F0 x+ A+ o5 f; F) L1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
7 l; o( T9 E- D& P; u. i) t" O
2、相关代码如下:5 h1 z! ^9 V4 ?/ J2 M9 F+ U+ G
//UPP DMA缓冲大小512字节" b8 u3 `2 G/ U
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
& C5 P( u5 y3 g; _* ?#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& q% l2 J+ d( \- L- K. I#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)) A$ m4 z0 c5 }/ s* `
' ]+ S. B: f/ u6 |$ F

# N1 Z/ W. e9 }0 \3 G! x) `, y& U& G//upp接收、发送buffer
1 N' z  g* M5 @7 r7 T5 t#pragma DATA_ALIGN(upp_buffer_a, 8)8 o9 S9 Q8 a4 `4 Z- |9 T- z
#pragma DATA_ALIGN(upp_buffer_b, 8)
$ A+ t/ [% J' Y2 q' e2 b& v# o6 r
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];+ n9 H5 [6 P+ l
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, D: _$ ^- z! ], m' F
  u% z! g: d4 d2 E4 u. d
3 }7 f% ?+ V; F9 F
static bool server_upp_data_recv(Server *server)
  e1 ]# M1 u4 E" V. y{% I' b; Q% v7 ?8 g% f9 T
    if(server->upp_channel_a_recv == false) {- Y7 a" p1 a( \6 V
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 Y' O2 U2 x/ I" f8 {: E& u( |
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
7 Y  R/ e- ?# d& e, c2 e) s            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
, T* T. R0 Q( Z# A! I, e+ z
2 U; N6 m9 o( B/ _, I! `6 Z  @1 Q6 q( n1 r  u5 U5 s) F
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 Y+ C4 S# w: o1 h7 P$ M* P) ]8 s7 j8 s/ J8 x: u
            server->upp_channel_a_recv = true;//$ s# E( U8 x: \; w
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
2 `0 n+ `& x& F' ?6 ~' D            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;1 T! H% S+ U6 r) b4 j# D
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% v7 c7 Z1 k& l  E4 c
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- M  j# p% F1 l) E% F6 q$ G: ~9 A
! [7 d2 j2 |. h# f
            upp_error_count = 0;* _6 o7 C  a# c; y* M
            upp_dmai_int_cut = 0;
1 C7 n3 b. C8 d' C/ I) d
7 D. S" _5 }6 D9 G9 o; Y5 ?2 Q            // fill in data
7 Z$ J8 F+ T; w7 p5 |- j! g1 P            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);( k1 K* F) z6 O6 T
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 }, l: f) f, h; s3 H5 ~0 ?        }1 `& A. p1 ]. t+ Q4 C, K* p
    }
6 W, ^0 r  k% ^! O7 H' _    else{
8 y# o% D: j- Y, @- Q& o9 A& q3 `; T+ b; f$ X        if (upp_dmai_int_cut > 0){- m0 z; I4 l" s7 C0 A! z+ L4 u
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 B% A$ [+ _% E7 d            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ e) o8 ~% E/ n7 b
) D7 I7 s9 I- y! \: _' Z1 l6 ]# L' a# u- |! N
            //copy data to upp_recv_list_busy
9 }& ?# ]4 R. y9 X) R* i6 K5 d            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);- r% j( h0 Q' B1 I
7 V( y* {' g8 j" u% ]8 V* [9 Y5 c# Z
            //
! U7 h$ ^( k2 W5 X6 F            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 j  i% B& |0 t6 u( q% ]( V' }: B; i2 C: n3 g2 t
            //$ y2 M/ r$ z7 |# a
            server->upp_channel_a_recv = false;//
: A  k" W+ Z5 O- E" h0 M1 L! b  Q9 ]  a9 k4 C- Y& B- h8 C( p# S
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");8 V1 e4 u4 v2 ~( @* }1 ]) Y" i- K
        }
, p% j8 u. U0 \    }' S; Y8 H" g) l7 k7 j
8 u  s% C% A6 i' E

: W4 o, }/ [6 F3 b    return true;
8 |4 ?7 m- M4 c$ V( i5 l. Q8 g}, p8 U0 I# P6 Y4 z
5 R+ X" I, |$ [5 m/ X
static bool server_upp_data_send(Server *server)
6 [/ O; D" Q6 ^0 k  f; `{7 _) z" j" X7 s3 S+ X0 k) e/ F
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 d& M5 o$ H3 I: O2 X        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
: u0 S# V7 f% b% B' I- f$ I2 l        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! _, |3 N. L5 ^; ^- A' y% J5 d
        char tmp[128] ={0};
4 |* u- S0 k7 C- a
4 U/ S& l1 K' t3 M0 ^5 }5 Q1 k        server_msg_send(server, APP_CMD_LOG, "upp send: start");
  U2 \  @, Z' h* h" F8 E. p        print_log(server, data, 64);$ ^( a, |; A/ M# B& W
( @' q9 @& G- h! T
        //
1 z$ M' X6 t: b8 J/ m        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
) o; x. I: A. G) N- A+ \        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
* f- w6 W1 {) x4 N/ z9 k. C9 M        print_log(server, upp_buffer_b, 64);
) Z& ], o7 Q% a4 n5 y  h9 k4 g. L/ E7 ]7 H9 T) S  U- B) z: }
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);$ b% d/ }: U8 a! P3 \
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 6 P: X: \0 [) F( z5 B
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
. |6 a' n) _- \1 }2 R; }        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
  L3 R( q& Z3 R! Y# g) P3 l, m7 b$ _1 J6 M7 S5 f4 f
        memset(tmp, 0, sizeof(tmp));4 ?# X( c# B- p, ^  O0 d5 |7 N4 H3 {$ u
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
' i* ]- r' p7 K0 c& a            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 X$ P) s( T* Y% \9 m        server_msg_send(server, APP_CMD_LOG, tmp);
/ ?- W4 r, b( {6 v( I" K0 L6 B. O7 A& {6 k
        upp_error_count = 0;2 [8 G. ]4 G/ m" m" G
        upp_dmaq_int_cut = 0;
! u5 x9 m) q3 L1 m: {1 W        // fill in data + a: e1 C4 h& i
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 }4 W: U( w2 g* K9 e
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' j3 @4 ^' j! x& ^6 z9 w; W2 C
- }- T: ~8 d. ~% O
        // wait send success
7 w) G6 G2 ^0 l4 _        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( p0 n- c- W8 f/ }4 A
. m. O) Y$ _3 d2 j
        // make data node in free list # P0 h3 d8 ]( ~# |
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 m& U1 E2 M$ S$ F
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
% X1 B; S0 r8 |    }
" L0 ?) G3 @1 R$ S0 z4 H. I    return true;
, s/ d7 n2 q+ d}( T; C2 e+ G3 C* [

; ^1 `/ i1 O" w. n8 O6 L( ~# {+ B
0 F. x; M8 b4 V5 x# H/ @

. D9 C2 z0 f% f0 `7 [( J7 |9 i
( X/ u. c# X2 u( _

5 \, ?, x, S+ O! m) e/ O& ^

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
( H- {- L5 ^: Y
2 w7 \! }* @- k. s) R( R$ m# z% i

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 11:45 , Processed in 0.043221 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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