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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
4 J+ Y$ W5 W* Q# U. w
4 W' S* |9 s: h& |; B问题描述:' A+ [/ V8 q+ x( H& ~
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
. b+ H, v0 j6 r( U
' p" K* K3 N* w3 p2 t, @5 r图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 X2 u$ m% a% Q

3 p, H# H7 B* n. r8 q2 I$ N测试结果如下:( B' \$ ~: s0 A+ ?2 X
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?4 ~! y- H8 }- E" B
- J$ @( v% n8 n% ?# u' z  p

6 @% J* R' {0 F" w3 ]4 u7 H$ u备注:' U9 \" f# q1 Q3 v+ C! x
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 `( g- i) |, ?. Q
2、相关代码如下:
1 ^; m5 h1 x4 m/ ^1 }//UPP DMA缓冲大小512字节
7 _4 n- j! Z7 }! b9 t/ F; V; ]& m2 O#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 A4 o; t4 C" q% O
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
1 e: Z) K% L: ~#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)- Y3 M+ q2 N1 L$ `

7 P4 m1 `( q1 z# Q' {' z4 @
3 t5 W% W% n+ Y- c//upp接收、发送buffer: L4 j+ e: L: x- k
#pragma DATA_ALIGN(upp_buffer_a, 8)
& Z! z$ \, G; Q* S- r#pragma DATA_ALIGN(upp_buffer_b, 8)
% H+ b9 X4 L6 A  _; q3 s
+ r( H5 T  Z, funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, j4 Q* z/ U% W% munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% F5 B8 B  e4 T2 H( G+ o* I1 L/ E" d) g

& ~. U: p: o8 n2 z5 }' Lstatic bool server_upp_data_recv(Server *server) ( }2 a- x& j  i
{
% C8 U* q+ U+ L: \, V    if(server->upp_channel_a_recv == false) {* f- ~6 B: V8 V0 H  e9 C/ K' ^
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");5 y0 n/ B2 ]1 h& j% j6 |
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- {6 Y- q+ G- O# v3 J
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");$ C6 o& k6 o( F7 J. j* z4 Q
# ^, K% r' m5 v% C  M* R

+ [; M1 M# g/ W* t4 ?            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
, o" o, }+ F5 a7 D" a; I
5 c+ P( M- Z0 G3 Y% k            server->upp_channel_a_recv = true;//! F0 y6 Y) w% X5 w, n
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
+ ~+ n* c5 A/ X8 W" J. s            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;! D, N+ M- d" n
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;% [7 F! H! r6 z, d# M
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 F1 D* G% H3 f2 [" Y

3 y+ K" }3 p7 c; ~            upp_error_count = 0;
6 P: d1 e; U5 r: b' D. s            upp_dmai_int_cut = 0;
/ r  G5 ~3 X* G* Q# [: u3 e$ Z4 U2 f$ T  g
            // fill in data / G5 J# o, D" U
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" |1 N  j2 Y- P  ~            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");+ ~$ i7 F; O4 a' E( P& @
        }' J3 c6 b+ `9 H: Z+ m9 l+ @
    }
; u! }$ }* h3 }6 u, t    else{
8 G7 `* b4 O( `% {; v        if (upp_dmai_int_cut > 0){* P! ?0 {6 Y: A/ [+ [3 l" N. n
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
9 D; ^; f1 {. O# M7 a            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);# v; u1 x- `) M. {! B0 S% \4 z

! [% P* n) b" n; Z2 o/ i1 `! h. S/ Q/ a, n/ V
            //copy data to upp_recv_list_busy' P& c" A' t; X. @4 S+ e& H
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. Z8 z/ Q, D* M# U! A' W0 e& N5 L. j
            //. b$ u  p0 K7 s  ^, J* q; ^; c5 s
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);/ K# \9 s# Q! X, o5 a

3 z1 c0 D8 J3 H+ l7 [            //
# E0 @* d- P4 S, u9 |            server->upp_channel_a_recv = false;//7 Z0 O! D9 M& l0 J. G* V* n; f5 K
$ u/ b. \+ |  [  K7 ^+ k
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
2 j" y& \; r* D+ Y. _! ~, w6 Y        }6 m% ?/ Z$ W3 v, o) }( |0 f
    }- m+ j! Q/ G0 i7 R4 P1 e$ g/ L

2 M: F% T2 {2 g- e3 S' {& ]! w5 H) e8 d3 z5 a% X2 ^
    return true;2 |: O( _& Q" B! h- Y6 ?  |
}* k; ?% d- _2 p, Y0 ]8 G9 X( E

# m0 d) B" U0 @0 zstatic bool server_upp_data_send(Server *server)
, @; w4 X; Q5 M7 g2 `1 n{* \" y* M) f0 g7 c& Y( M2 i; j
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; i2 S  j9 {/ N; H! w        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 x. @" E. K& U: o8 l/ J, n
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
' A- `* l' n1 H2 S" P0 M6 g/ ?        char tmp[128] ={0};
7 e! t2 v# U  ?: w* T1 O$ L6 v/ L
) r  N, U# x" V8 v$ y        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 f8 Y- P0 j: Z3 q& Z0 p        print_log(server, data, 64);
& y8 s. p7 J" O4 G
! }6 D3 ~5 D! v2 c  f. t' b8 c        //
! d7 P8 w. M$ G$ Q7 M1 y6 g        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);2 K5 l) Y: x3 u* Q- x$ r
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
" }) m- S' s5 g; h% g* c6 V        print_log(server, upp_buffer_b, 64);
4 P" P2 y" P% ~  T$ e
- s* X9 \/ P8 I! A; c        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);' `( H/ ^( k- Y+ g6 G! ~
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
0 Z; o+ U% X3 E* p9 q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- a1 I# R3 W4 w3 p$ C( Y3 F: R
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& B8 p  R) f0 b6 B  t! J$ |: E1 ^: L! c0 K' y3 I2 i+ f9 U3 H0 o
        memset(tmp, 0, sizeof(tmp));' ~& M0 C9 W) r
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 Z+ L" G$ `6 v3 k# K( a! ^
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
# Z0 k& p' c, B; O5 O- t* v; s  ~        server_msg_send(server, APP_CMD_LOG, tmp);
. r4 }0 ]9 s3 @2 d
( {2 M+ r% e+ Z, X. o        upp_error_count = 0;- j+ h' J: p. {
        upp_dmaq_int_cut = 0;
2 d1 _+ w+ [* F6 V        // fill in data ; h7 D" @8 p2 M7 K
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * z8 |$ y7 J% ]9 ?8 R+ j
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");0 |# B  E; ]" D# o
& }: i+ j9 i$ H- H6 ?: |" B
        // wait send success
2 ?9 h& \: n* ?$ f. r" W3 S" F        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ) c5 _6 q' f& e6 C" |/ }# e1 t

! K" j  V3 d" w        // make data node in free list ) w( o3 M' v. c, J( R' R# p" o
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);) p/ G) q6 f! n+ {" D( p4 ?
        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ f6 @/ r7 I  H  J' }" F* _
    }
( }- `( f1 N. `: S0 L9 @    return true;! O8 g2 t; T6 a; L7 a
}& K  {, G* j4 m5 \; g' E2 U
0 Y9 E# G( a( B) ^3 A2 l8 [) R2 n
, x3 E1 j+ O* d" V& E0 ]
0 z) n- t0 [7 x8 Z+ b% n

2 Z) `4 }5 j, y8 {: W$ d
- I  U" c" e  o6 S( J% v6 v2 G) f4 q/ G

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐& l/ r$ }* q2 g2 m' `/ f/ x
% P0 {/ y  G# H1 S+ }

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 07:30 , Processed in 0.045606 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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