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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ; `9 [6 T" J+ D! k" N5 L. W

( S' Y' |+ A# p4 ?问题描述:
  F8 J$ T7 A7 ^" t$ ~; D  r在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( V3 E, l) d/ r; Q2 b% T0 y' V0 x6 ]: T6 ]- ?2 D! N
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; y5 c  G, z5 A4 W; K0 K
  R. B- s( n: A) m9 d. O
测试结果如下:
3 U. `* A6 h3 l! _% r4 k138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 G- \& g' u# `' c1 p. H& W: ?' @5 \6 k- O" e

; v/ ~8 H# X: i! e  Z7 [备注:+ C+ Q/ s9 y" X2 ~3 z
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ x' Y" a9 X- r( b* V! O3 I
2、相关代码如下:
8 b' M7 O3 S& _" L" M: T//UPP DMA缓冲大小512字节/ ^$ G. L( u8 R$ R" C" I
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 |/ R# I7 T) X3 X
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* Z0 p7 `8 g0 \& W, {* [: B: V#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ x% j) O$ Y' L$ ]( U& c' }$ ]% w

. w* H; r/ v8 r8 }
! W7 H: H, a6 O( i  v8 s//upp接收、发送buffer3 b, c/ ]( r: L. f  B, q7 O! U
#pragma DATA_ALIGN(upp_buffer_a, 8)! d+ w: S, c1 w( |0 m$ l/ N
#pragma DATA_ALIGN(upp_buffer_b, 8)
" S6 L6 W3 p9 m4 Q0 o
) T3 D3 r2 I9 ?) h1 p/ nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' P1 V5 z. x. Q3 d6 }3 Xunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 U: l- U$ ^# w$ v
, m& ?! S  T" }, V8 ]
3 O  o3 r$ Z! E% S- i' k, t% v+ |static bool server_upp_data_recv(Server *server) + ?+ i- r9 M" j9 M5 i/ [' w1 b( z; V
{7 ]# o3 @. q1 }
    if(server->upp_channel_a_recv == false) {
% J7 t  r+ v- n        server_msg_send(server, APP_CMD_LOG, "upp recv: start");, `: ~- K8 Z  }; P6 `: }
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 c( ~) {* v, h' Q            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");  h: N4 ?) t% D, p
( C3 i. G$ i$ t3 m+ i+ W8 C

- F* s% D) p! r4 d$ _( w1 o: T            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
: M6 _7 f  J" d( U  d! f" u3 s/ w# W; ^% v1 y' R
            server->upp_channel_a_recv = true;//
) D6 y- X3 r. K5 F5 [# E- {- z5 I            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
' W- w" Q: L+ q" Y6 _            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;" i1 X2 S( R) l
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
$ i: r. \8 Z; ~            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 G2 \& B' f: p  P" }( R5 m' Q( W  o5 M
            upp_error_count = 0;
4 x0 @) F) s$ S! _* L            upp_dmai_int_cut = 0;
, ^3 \$ x8 Q! V. I1 e6 i4 {
" g4 A9 d( ?6 r2 @4 ?            // fill in data % w7 k. |1 t  l
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 K4 ^3 O! E# h" n            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ P" S- K3 M! K3 E4 M! d
        }% f6 U) T6 i- @2 k* E$ i
    }0 i( K9 z+ @5 _; O
    else{, ]# m) @% y% R/ u! K$ s( w0 A
        if (upp_dmai_int_cut > 0){$ F' t( _( V1 J! M
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) A; w/ U3 s$ r' u: _9 m            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# Y. @6 [) D( V! J8 `5 D

+ M4 L- m& ~  a9 c
! u) a# \3 h: z! u7 U( R3 y# I            //copy data to upp_recv_list_busy2 a8 i* m; `* s5 P, ]6 V4 E
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);  o2 W5 k$ q( n% ?4 b

* f* x* F/ a" m5 s; c8 g( S            //$ G4 S0 \" v6 D( g7 v: O, H
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; T2 r+ X% c; `( O# F
: x$ L* i& Y9 r1 B0 e, g
            //
3 Z/ z1 C6 p0 Z$ a+ R7 a* L            server->upp_channel_a_recv = false;//. Y7 s5 w" Z" g

) S/ H6 B7 d% a            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
  t3 B/ p) K& B6 b. l        }! m0 o! c: U) _+ Y
    }
8 u3 q! h* H2 `# a7 f) L/ F7 R

) D% h  d3 {/ A2 ?- f0 O9 @    return true;
# Q( h5 D9 h0 C7 E# a" n1 T}8 |# h% ]( ?) D' R! L$ G

3 q9 M  ]# j3 o+ f) s6 l2 nstatic bool server_upp_data_send(Server *server)
# W( Z8 Q& c) Y{
' Z, x4 l7 r& R+ {+ r# ~# A    if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 G4 K9 n6 S* x8 D
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);8 r0 }1 ?  M* }6 W$ r
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ _" s6 ~. b# |- E# ?        char tmp[128] ={0};
8 l3 D; Q& F" {! B* a" u; o' L& D+ v) v- a
        server_msg_send(server, APP_CMD_LOG, "upp send: start");& o2 C; {/ n+ E7 r! c
        print_log(server, data, 64);
( A1 l9 G) v; A, y
$ [6 A- N1 Q3 ^" [        //3 l( {$ W- P0 L  ]0 B
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 B( ]. K; P" T8 B0 K- C4 |" w# X
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 w2 \) d/ ]% S+ W9 c, k/ L        print_log(server, upp_buffer_b, 64);
1 S4 o8 e. E3 z4 r9 N1 S. e# U& k8 A4 [& P/ ^' S! i; |
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);" L1 K3 s$ n; t5 O
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; # ~2 M4 j: l4 Z: E
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
1 w( b0 U/ u' i, D7 ~        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;% P9 \. w' b, H7 b, [# s

+ T3 N7 L+ A) A. x' ~/ ]        memset(tmp, 0, sizeof(tmp));* n% M2 S5 M8 O5 N% n
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 R' W0 F8 O$ m9 L& _            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# _+ ?5 \+ B  S
        server_msg_send(server, APP_CMD_LOG, tmp);3 P6 O6 j1 a% Y0 f5 i
% H& ]9 t" d- \* I: |* `
        upp_error_count = 0;; A, m. F% M) }+ M& G4 Q& f' X- }6 t
        upp_dmaq_int_cut = 0;+ Z8 m7 e, g) \& n8 P: A
        // fill in data
- ?3 e9 A8 C- Z" k+ S' Q2 X% s( |1 p        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ E. r% d* Y0 K" v# j        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ D% V* k* F6 r6 n
4 W. \1 K, W/ N  T
        // wait send success& d6 E( D" r& m+ W* I4 @
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' L& V6 C+ ^/ t) _" c( L+ l; e6 p3 h9 b; m' j% s
        // make data node in free list
: `2 x  ?9 a3 f* H" L7 ]        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 ]' j/ Q9 j0 e# W0 @        server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 \& c4 L  i4 H7 `4 A8 }0 R    }! J" }# S+ R  y+ X2 n
    return true;
) |: Z' g  k! }& H/ r1 j}
  e# [% u4 v9 l- E9 r3 r7 E. K: B9 I0 Z* j8 G1 d
; C) ^# h8 R% k, A

/ m) F$ J  y! l1 ~
: K9 Z3 {5 d- d5 l: ~
9 B0 o- A' Z" U2 m$ ]

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
4 |! U9 V9 Z& p5 d! P- z( ], i3 r7 f$ h, E' L

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 08:16 , Processed in 0.042098 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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