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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 : c3 X: o7 Y: T! v/ v6 }

5 ^% V( J5 f& K8 R* c0 T问题描述:& @0 k0 ~: l1 m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) u! s4 N  r% M( E: J+ I
% f  b  Q* E$ C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. Q0 a" V; x. x) @# }2 B
1 R% j8 S9 _$ w; _- D2 k2 T测试结果如下:
7 {0 a" z, |+ n& r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, F; y0 Z9 e% Z, x, _

# g: y6 @9 J3 {! D, q1 ]' `( x9 K' H9 m/ I% b0 J/ _! |" k
备注:
' v* ^0 z& B! ]1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
5 Q, O9 U2 {" S8 i
2、相关代码如下:4 t" W* @, s; i
//UPP DMA缓冲大小512字节
% q8 W3 g, M* e3 U( ^( J* @. o#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 ^' H$ b, q0 l, W1 O
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
8 @8 z! S: w! J3 d#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( G; Q! e" d" |1 ^$ k( L9 f7 \; u
# w5 p9 v& o' M1 g

$ ?. }9 D8 Q4 e# k/ |! f; Z//upp接收、发送buffer
) A" Z! w  M: ]. q  g; g  ?#pragma DATA_ALIGN(upp_buffer_a, 8)
+ I5 Z/ X. Y4 h. e5 V#pragma DATA_ALIGN(upp_buffer_b, 8)
- s0 k8 S' K; T" m% i% p( V1 i
  o9 o0 b" E5 n* v( v) Junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) s+ X4 m2 {9 x& ^" ]6 W0 {' k( ^
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
/ w: W! w/ S; Q! Q$ p/ n' N* b+ s& {# J; [& ?

9 B6 I# R. f0 _& ystatic bool server_upp_data_recv(Server *server)   z- V: M- H3 r: @& _
{
4 C$ ], Z" F' j, P/ c; I6 \5 K    if(server->upp_channel_a_recv == false) {
+ j# o' M. s3 A6 t/ x# s        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
/ i0 X5 H4 `# q  [$ Z        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. s6 V7 W3 P# o1 g0 y" ^# h            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");: ]7 a) P% R  V9 J

4 J/ @5 q$ P7 {1 o1 E# v  B8 g. p. t* u# G) l# o
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
3 a" y& A  ?& r
9 A3 g1 C. l" N. v8 G  t' S9 x            server->upp_channel_a_recv = true;//
( B+ w1 N, d4 [5 |8 V, _            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);7 ~6 k6 l' j- _* n& C/ h
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ h! f$ M( _* _" @" D( G- k4 G            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
5 O  |' U# ?: f5 x2 C$ Q            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 T) n' l* @! `. n1 t1 Q
7 Y! o- u1 s! n! u            upp_error_count = 0;
) K0 ~2 Q: M1 T/ y% y5 O+ b1 c7 L            upp_dmai_int_cut = 0;7 ~( O4 S. b# v8 x! Y* T' _
5 A3 A' }! b! o# s
            // fill in data 3 d% ~9 P2 e  X5 ~
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  \5 P" O2 J2 v  ^5 N
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
* V0 z4 ~+ U5 U        }
5 G1 s7 l6 d( i' _    }
- K: Z; B2 H6 e( v7 j" ?    else{; _6 I' \4 v: q' I( X& {
        if (upp_dmai_int_cut > 0){
1 O- m! Y( n# }3 }            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ C5 ~$ w; o* {5 b            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 ]( e+ ~" ?; F6 M9 |1 y+ T: ]& `* p; M/ ?) Y. [! q- A8 D

; Y$ k( @5 o4 d( S. R& v            //copy data to upp_recv_list_busy' I+ F. \3 C/ l4 a9 d: K
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: z+ U7 C) w# N$ _

! ?6 S" G. ]8 r$ n            //
9 k; u9 k1 w7 U9 I            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  _* v9 k2 x( l: W2 y7 ^) ^
# k, V3 E: A8 _  P# S  T' o+ I6 U# }            //3 F7 P% R. R+ n  v- {* Y. J
            server->upp_channel_a_recv = false;//) u' z8 l7 V: Q  H( ?4 Y

0 G4 v+ p: H) U  @$ d" {/ C            server_msg_send(server, APP_CMD_LOG, "upp recv: success");& |' l' V* D7 ]* j/ O. s# y: ~
        }1 o3 n- e. u7 k4 Z3 p/ w& e+ X/ t
    }! d8 F6 m3 }( y4 G6 U

. }, N" c" M* ]% d' v, x7 Y; k+ A) P( }
    return true;0 x/ e  e# {, d" `0 w
}
* d9 u! B. L2 Z2 ]: R+ k) R  `5 r# h5 W
static bool server_upp_data_send(Server *server)
/ }* q% j3 j5 ?, s{& z) Z2 X9 ~* f9 \  o
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 ~0 e/ E) r' q0 m7 o
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
. @6 J% v/ n/ M+ N        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 N  `" t' S( J3 f4 N2 b- o
        char tmp[128] ={0};  T) L/ v7 c2 D* f" S

4 Z& Q! k- l* f2 z5 ]' d- h        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 k) V' x: k# e! Z8 b
        print_log(server, data, 64);1 F) e7 B6 [8 L/ U( ~
. B6 z  w  P. A% c1 q* ^5 n) q
        //; K- _) Z* D6 d4 k+ L
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, V* Q0 M4 x' a: W' A        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 z) @$ s; T0 y7 T+ c/ }8 W
        print_log(server, upp_buffer_b, 64);
, R% M1 s- r+ I6 G9 n/ x1 R/ O
7 G' B$ _; [3 j3 v        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);' q0 l5 Y& F8 ~9 d  E
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
( N9 T2 h/ K: D/ _' f! |2 @* z" y) \+ P        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;, Z% _+ {0 U% S' X( P- M
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. ]/ i6 C$ }- C2 t# F! ^% P, Y
! s! N  T. O$ f3 y! P        memset(tmp, 0, sizeof(tmp));9 z0 H4 z2 `4 ~! E& O* R! C
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ a( c. Z7 x) M- ^: H7 o            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 X; U0 C  ?4 l7 H3 n' S+ X% l4 s        server_msg_send(server, APP_CMD_LOG, tmp);
  l+ a  c1 m/ @* z$ B+ P7 R
0 I" e, ^; f% ^! G        upp_error_count = 0;
8 |2 n/ z8 {7 i9 h        upp_dmaq_int_cut = 0;
- F6 T5 N) U. b; ~' [        // fill in data
- M8 `5 Q1 @, U6 I1 f        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 H2 n6 l! X! r* M$ C        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; t; F7 l5 n/ P- j. H7 }
- k% |# `7 z, P: p' T3 V
        // wait send success# A+ a- G2 G- X$ N, l
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, B* d7 h2 o/ e" X1 a; Q$ Q6 ^2 @) R! `9 O3 S' K! Z; j
        // make data node in free list
# p1 I6 ^0 ~6 K8 q+ w' H2 x# [        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
3 V, J6 Z% }- i9 j. N& l, d        server_msg_send(server, APP_CMD_LOG, "upp send: success");
( \6 ], g0 K: _* N$ d0 j' J* s5 K, {    }8 t1 T6 o+ N0 T# d5 z7 X
    return true;8 C* x  s' z9 ~1 m; c; n4 D/ {
}: t# R, a0 p  |2 k: y+ k: Q0 W

9 s& @' x/ m  {" }
1 ]( ^) Q3 J& k$ b) n5 s9 b
5 v! j# w; @3 d4 M9 c
+ ^0 t' w- D. [+ |7 r
4 b9 U% y( Q5 g! q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐& e9 y1 N2 F* `, R
9 u2 ?: c" s9 H% G  @3 b# Q  j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 22:32 , Processed in 0.040361 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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