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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / Q$ Q, R' c# l

* w6 O2 T+ b8 F2 D. y问题描述:
# M5 P! ]; |+ e# }+ d, z0 [0 t3 i在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:3 Y* t, s3 C3 a1 Z
9 Y! }/ }% Q# a/ G! u7 }6 }
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。& K1 }4 L$ D6 o* N

' O9 x7 B' v$ h测试结果如下:; H( O$ J" U+ }! Z, y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?) {2 Y6 D/ x0 j5 c7 L0 N

& G1 v- S* R1 y9 R/ O' ?" p
. P( t9 y9 Y. s( F& R* m. s2 S备注:
# t, i$ V( [6 b' `7 W' _1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# A: W4 r% O- D
2、相关代码如下:
1 f* Z- `8 y$ \//UPP DMA缓冲大小512字节
& o4 A" S# s- J0 `9 w# a#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 X/ l; s2 h* M# O- u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
6 ?7 U/ a% j+ R# ]7 `5 ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT); i2 Q' j* @! b
  Y- {) n6 d  b8 P$ L; v. g
9 e+ z  M  D. l- F+ b- M' G
//upp接收、发送buffer1 y* M- C7 ^- b: z. w$ ~% Q
#pragma DATA_ALIGN(upp_buffer_a, 8)
% F: J' V9 j1 Q, g) ~" r( F#pragma DATA_ALIGN(upp_buffer_b, 8)* s; O% m$ e) m+ d

. q/ C' }) p) Gunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 @! p. H% i0 X) z  w2 munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];/ u8 _  ^+ p1 b6 R9 r) a2 }9 ~
9 l7 d9 Z3 G. N$ Y: T" e# R
  B8 w# r* ^; {$ q( j* }
static bool server_upp_data_recv(Server *server)
3 y' o2 [* B/ }8 l{
: l* j- r1 f1 o& ^7 v* G0 _& B    if(server->upp_channel_a_recv == false) {
% f9 d! R2 j" Z  B        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
' S1 f5 `4 n1 R( G; `        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
+ J% k" V% g, Q/ N            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");# w6 r  r# b# y3 P

5 v# d# C1 J" D/ j* w4 g( k  V, d1 C
! q8 m+ h3 ]! O            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 O" C% `+ c  ^7 S. c
4 r1 o+ n- Z  s) ^7 n' s7 u# Q
            server->upp_channel_a_recv = true;//5 C8 U( g) A  `
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);" {" X. e* Y" K2 C" v7 B2 d% L) z7 v
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;; }2 U! d: ~! i) J( ?+ p/ Z
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;" ]9 u7 L: ]$ Q& Q. i
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
1 {' q! w) V$ v. ~$ J- ~7 x
5 [5 l2 ]( P* g. k& h# N            upp_error_count = 0;% `7 [4 u* Z4 P
            upp_dmai_int_cut = 0;; N4 g* E/ r2 L8 K' k2 Q6 ]% ]0 x8 i
' ^' T5 F, o2 H( O
            // fill in data ( J6 C* B. C: P2 x& q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 i4 U' p2 d. M; K; r8 L" y7 u9 \            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 P! B; A) R; S+ \. ?. v
        }
8 w* _: N9 Q$ r1 m3 |    }
' t8 H. T7 o9 z- U& r% N$ W) w1 F    else{$ o. ?6 y  Q8 I
        if (upp_dmai_int_cut > 0){
5 _7 t; J  ^' U6 P0 M& f            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 C' e8 L" `) R$ V$ p            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- K2 a# o: j# z4 L* e: W! i. Q& R  G( }* }/ n; {

/ j0 J; D- t* o' f0 l1 |  I            //copy data to upp_recv_list_busy
" I) P( j$ R  u. a0 F            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 D! s5 w8 I7 r* G
5 F& F/ |0 [9 n. \- D/ l
            //
$ L1 d6 d& G8 v* q1 o            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);6 D9 l+ e. `1 ~9 W- i% L

0 q6 L- Z4 Z5 ?' Y1 _" l- `* Y3 a            //& K) G' X; s4 ~5 |8 v# u( S. g
            server->upp_channel_a_recv = false;//
5 L6 }6 ?( K5 [8 i0 p6 G0 ?9 R6 N1 u4 v" K& b& o4 M
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; `, n: y, _) Y* P$ ^/ S
        }
/ Z- G1 \  X; H( R+ D    }
; ^' Q/ y- n8 ?2 [3 c
$ v! w7 D. E" D5 y' g0 I# ]. j: z3 H: q4 D
    return true;+ H* N! o% s7 K, {6 r* G  B5 R; o
}
" k; o! E4 d% x! l9 {8 z( G, i* `: u! M" I9 Z
static bool server_upp_data_send(Server *server): n% _! s: x* l2 U- A* v6 I% w
{9 p. C8 `5 S) c$ n& |- a- g0 Y
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){+ r$ ~3 d- q4 k
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* }1 m7 L9 i( H( e; [        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);  Q! k6 v( L. f& z, S
        char tmp[128] ={0};% g% K5 A& U) x' t( _
! k2 p% |) B+ ^+ k1 p9 |6 h
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
* o+ L; b4 F+ L2 n) j: ?- i        print_log(server, data, 64);
* e5 b! r' ]8 y! M% }; J5 `1 n  c$ S- I/ @* o: D, q
        //
$ W% o( g+ t( l3 R1 a# |0 k        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
8 t+ ^/ V) \# d8 Y& a6 q  L        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
, m9 {# v# }- Z        print_log(server, upp_buffer_b, 64);
# s* s7 A' q- D+ Q+ I; U' r; Z! [8 c  I. u- W  ~/ p& d, o  ]" \
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 a& b3 I& J6 @4 d6 {/ i% m        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; / K, g5 H# l9 G
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
- @$ \- G$ x7 I% V        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;  x0 A: e. r& W+ x( Z7 Y4 G4 Z
& s+ {, r6 k* |5 \, K* G4 c) ^
        memset(tmp, 0, sizeof(tmp));; B& G# W5 t) [! }
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 4 l3 d. \/ f1 x8 j$ s
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 {+ D$ x9 e; j
        server_msg_send(server, APP_CMD_LOG, tmp);2 U, X8 @% T! r( j
, p% p' _$ l. ~* u/ D
        upp_error_count = 0;8 s7 v# L7 |' e# I3 Z
        upp_dmaq_int_cut = 0;( x. O$ E9 V, G
        // fill in data 5 b" {: c. A# W5 N- q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); + W8 A2 O, M" _/ v% L
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");, ?/ n& f$ w  |' h! C

( [4 S1 I# u; k! ^+ r, q! P, X3 A: X        // wait send success
) T: ~2 y0 v% e& J, z) Q) w        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ l: I8 w  F1 ~! F- W8 @

! y/ W" {3 V. g' x( }3 z, [        // make data node in free list ( h0 L' A' a, ]! U4 {
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 u6 b/ v: l0 i7 }9 I7 g5 P( _
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
. ]8 P) j- j/ z# C$ g+ Z5 U3 p    }
; l% ~: K5 g9 |    return true;
7 x# s9 B+ {9 V% x}
9 F; h( m  V; K
0 }: q5 v6 n: b8 _, a
+ i& b. E  l# Q/ j1 m

) n# q7 d/ f: z
% H& T, C2 n$ A) N( ~  }

3 t, p" H# o- u8 }

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐% M- r5 K7 I* k4 c$ ~% b' c
6 x$ F/ Z7 n+ a  f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-25 08:44 , Processed in 0.042576 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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