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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 a3 j/ V5 E  s8 o  h
  g4 F  d4 S# q3 g- X1 G# ]3 B
问题描述:. a7 g+ q0 K8 ~1 v& H6 B9 H
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ v3 a7 s* E* o( {
7 K8 |9 g. ?0 @0 d; j. Z- Z
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# a, b9 R) B) B% i0 _$ S0 N  w

- T, m' v6 _9 o: k/ [9 e测试结果如下:6 k5 ]! L* z: V+ A6 a1 [6 m
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?5 n; M" W# g3 o7 x) }2 [' {

8 t2 r( e! C# ?# F  n1 N/ y, b
& f( w+ w. `0 Y# @$ G备注:: r/ Z$ X, N: Z* Q
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& L! V, {# |8 p. Q3 E
2、相关代码如下:5 L/ D' ?  `1 s6 f
//UPP DMA缓冲大小512字节$ [' _2 C2 K' V4 j! m
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍' @7 h3 m* F" S" n4 z! D- S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT3 G; p# O% v- P' t
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
. J) c. ^% j! V* W' n+ m& t; ?  }6 q. j1 S

6 J4 E; ^6 {$ |4 S6 a//upp接收、发送buffer
0 A5 G; M* a, y$ b+ s, l: e#pragma DATA_ALIGN(upp_buffer_a, 8)
9 k- ^. p. ~7 z4 d# b; w- ], n# d- ~#pragma DATA_ALIGN(upp_buffer_b, 8)
$ K- }# I* K' l
. r! V& ?8 S/ k2 X% _0 X! @: C2 nunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];; ]3 ]  B+ I7 ~" M3 v' G5 q1 Q( E
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) O4 r4 B- @% R0 y8 f" P9 G
- J2 V; ~6 z+ N& [/ r

" m9 Z' b0 L* S4 ?, d6 Astatic bool server_upp_data_recv(Server *server)
' I8 R/ v$ w% ^* E{
% R. {7 ]. d. [+ y; ~6 y' @, c    if(server->upp_channel_a_recv == false) {# C- b. D# k: ^! {
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
, @: n  I' b8 B. H4 z) X+ D* H! |        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- N( Z8 z: I4 F1 p
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
9 }: ^( |" _2 p/ h4 F' N/ B& W0 o) W9 @
# l& X- N1 W7 x6 p$ H
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, ^( C: |3 h8 j. B+ c
/ W' O- }# B+ r
            server->upp_channel_a_recv = true;//% |2 W* b! y  O0 D" P
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
4 p( N1 C( H5 {$ c3 E            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;0 L' ^! B! W: X5 Y
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
7 |5 V( ^/ K* @$ H, ^; ~            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
0 j, v6 T) w4 E( w- G5 A5 k. u. c% w% q5 U& ?' p7 q+ {% k( B
            upp_error_count = 0;3 ]3 [" B/ W$ l6 L$ k* Z3 p
            upp_dmai_int_cut = 0;3 o  {" }; O9 \7 v: Q

- C& s' y! c: T1 b( f5 u            // fill in data $ T8 s) J8 G- ~& j. m- g. ], N0 z
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* ]0 T0 `% A! g0 N9 m6 V9 }8 ~            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& z% h6 L# ~' c  J7 f; G+ ^        }
8 d1 N1 N4 S7 O" @+ a# Q    }
8 O6 B  |9 G% Z/ _( q' y    else{
' e5 E. i1 x; A  Q        if (upp_dmai_int_cut > 0){4 k1 j7 g# ^! b
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);# F% _: [+ G, W6 K1 @; i
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);, L; W+ t1 p$ x0 X
5 G! r( J0 g9 H/ e6 I  ^

8 ~3 [2 D5 s7 T$ y4 ~            //copy data to upp_recv_list_busy$ e' o+ u9 t( w* P
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 }8 Q4 G' i; H

. H) d  J, z- g            //
$ D# w/ o: k) t. [& D            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 _! P7 G7 G, A% p" d! i
& g1 N7 {  D2 X$ b* S* s' r            //
" P: v8 p- `0 q, ^4 I            server->upp_channel_a_recv = false;//
1 h5 j! y( R5 I
" F9 y$ E4 P# G! c7 a            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
5 F! d' d/ I# p        }; E1 \% @6 l7 @- g* B2 [
    }
. b3 E5 _3 \6 a1 I5 G1 H  ^* `! Y6 B. I2 \) n. y- p+ c+ f

$ L: H4 ^- W% s- _# |$ P: a    return true;. s! o& ^( H4 O1 N# l
}7 D! R' w  A& r
! i- e* K: R$ L* n( Q5 C
static bool server_upp_data_send(Server *server)
3 x8 K) i& e! \6 l# c4 `9 V{% m* f3 n2 E6 {$ ~. w) V0 D: p
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){* U+ [3 Q0 J6 ^" R2 y9 X$ J
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, h2 a' y( x0 v& D& W5 M1 x& x        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% O9 O) Z: K; {1 ~7 }6 n        char tmp[128] ={0};8 o5 v( K5 p6 Q9 h
, B2 j- u- I: m9 R9 T; g( _. U
        server_msg_send(server, APP_CMD_LOG, "upp send: start");" I: k' u& f0 Y. k( g) `3 B7 S  C9 Q5 |
        print_log(server, data, 64);
1 W2 G, m) Y" X
. s7 U4 F! L1 }& P( X' b        //
- f2 _: I1 n( ~: I$ I+ ^        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
# L/ F8 b) f& g; S        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; M- J3 _0 o. U9 Z& i
        print_log(server, upp_buffer_b, 64);
' W2 A* \" ^. b0 U( t0 \4 w9 A. z5 R* U8 L" d
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);: {* \$ r" l# f+ _: `1 o. L0 l
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; , G% F5 B1 o/ [( u! i, V3 {
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;' i0 u0 T5 S8 V" R2 _
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;1 R# i& L- I5 @& q" |* z

4 H9 t' D7 u% B# _& i8 _        memset(tmp, 0, sizeof(tmp));# k8 ~9 B2 V; h  Q. g8 j
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 O9 y5 K9 g2 o/ q0 }# B" N            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
$ ?1 i! a1 B0 f6 X: S) O        server_msg_send(server, APP_CMD_LOG, tmp);
8 F; x1 n( h; O9 y3 m+ ]$ {' n9 E/ C9 I
        upp_error_count = 0;
" p4 X4 V( c. x        upp_dmaq_int_cut = 0;
. x4 y* }9 T, K' A6 h1 D) n$ `        // fill in data ( F/ s( N6 r2 K/ p3 v$ q4 S
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- J- Y& R- B# Z6 f# F8 m        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");% p2 k8 c' G" B# K9 K( z. n

# r! f5 W- p0 ^* L9 I6 m8 l        // wait send success
2 E8 @8 A; _2 e; o( k        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : W& D* |& i% c0 q3 w0 o. n

* u( J1 F6 e' l9 ?        // make data node in free list
; `. s3 R0 j/ ^6 v! n        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; i3 c0 e# f( o0 l; h
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
! D* x9 S8 N! G    }: N$ J8 |. j2 |5 \) S+ Z
    return true;
! p6 z8 K: J8 k4 j7 e* L& \3 y}
9 [) N( W' x% D% m2 r
7 d9 m- t7 t; {) b' ~# S# `

" A! n# O/ Z4 n% I! t
+ F2 n* H7 d6 {) w

, l/ q! U9 w4 d6 K& K9 ?* S
8 ^0 F0 D. F1 |4 U9 b" w$ m3 e6 y

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
0 ^% N( B- Z0 G8 `; b5 X# f4 ^
  f  ~* R9 P/ I  G5 \  U

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 04:55 , Processed in 0.040050 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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