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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
) I# }* ]7 A2 C' y+ I  e( k/ o, [1 X) g
问题描述:+ I& c/ P6 K9 |; F. x  X2 U0 [
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' f# h8 y9 Z! F( y6 j
9 d- p/ ~8 Q7 b" ?$ {0 N5 k$ @图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 o6 |( R1 \; t0 a
8 V& H$ v1 M4 f
测试结果如下:% a: D9 o7 v0 R% v
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( |- |, f7 d) k9 K7 l7 m6 R1 l
  z+ b" K$ ?9 T- u
( _  k; |6 E7 h/ _4 P7 b) P
备注:
' n, n2 J0 c' {- H6 D1 t1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
9 M7 `8 g  o9 J( J0 Q
2、相关代码如下:
2 Z& {% q0 O* r/ D& v; \* @/ F; J* ]//UPP DMA缓冲大小512字节
8 E& M$ B9 Y- ?- Y#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍5 ?0 Y8 h5 O" ?/ I  {: E
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( [- u8 a6 `+ N+ b- V2 v#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 [) V% d0 [/ h2 C9 ?) l
: R$ C% p9 i% L$ X7 J) A/ o) B* x' \
//upp接收、发送buffer
  l- `3 O% P) @, \. Y1 a#pragma DATA_ALIGN(upp_buffer_a, 8)
- D* j$ j3 ^! t& I: s: W2 k/ w#pragma DATA_ALIGN(upp_buffer_b, 8)( i  _& ?! H6 Z! _
; {5 R$ Y1 v4 L/ i8 Q8 o
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# n- n, a: `! T8 d& n
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ H/ J# [" l/ p$ y3 W& f# E) q& }- H4 c* N; L1 M

; p$ D, V5 R7 m* Cstatic bool server_upp_data_recv(Server *server)
; G. W  M  H$ ]. Y* ?1 n" E- f{1 m6 i" u$ O4 U$ t* @* ]1 {+ A) Y8 {0 N' b
    if(server->upp_channel_a_recv == false) {
3 K6 U/ L2 O! \. h. Z        server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 X3 r3 x6 T" H2 Q  R4 v8 K
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. I6 u6 m/ F) U* O' g& l; P
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 J7 M& c+ j1 h! q; k" n1 _- p

/ Z% j7 O& w# y# N0 n$ z5 a" Z8 K, ~# o- j
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);- X$ f) ]9 D3 A- n+ [. q' f/ R
! r4 s' S7 A  }
            server->upp_channel_a_recv = true;//2 g. V& u4 C3 c0 ^6 e% d/ ?
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);% E+ c% ~1 `% `! s1 J0 O* U
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;# @* a9 t3 y' Q" p2 m; R+ B; }
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
# z* P/ y1 w3 E, J            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//( ~* `+ f2 W. }) j+ A* v
* \% _6 h: e" C8 b! A
            upp_error_count = 0;
7 o" N. Z/ Z" l- A5 J& d7 D            upp_dmai_int_cut = 0;+ v8 f- t  k. b
+ s4 N) v: ]8 V: W" ]* V
            // fill in data
" X' C' t  R+ V# B# H6 T* [6 [            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
8 U; c8 k7 a0 C; `            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
/ x  L. n" ]: ^, z" u5 m; L        }. m- j/ y: H, T9 m
    }
/ P) Y7 o- R' H$ p    else{1 z, {7 q4 ^9 Z# |7 a. g3 z" p5 T% ~
        if (upp_dmai_int_cut > 0){6 C1 Z6 |9 Z- f! k- B8 [
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 _, }( a  f2 A( y8 R            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);+ Y  V% Y+ ?+ y' L( O

' ?# S  K) b  E  s3 B$ g* g/ o) A. _
, n2 _' b3 e0 W" |, f            //copy data to upp_recv_list_busy8 {- [+ W9 W6 g: n+ l: W! w
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 p( @5 B* p/ V4 {) }0 O; K) A+ a7 a* c% x/ l8 E
            //
! ~2 C+ q; a) W$ D            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" Z4 w: z2 C/ M2 V; L
& L/ [2 N! p$ u1 v/ i; o) p            //" W8 R  y! g; C6 k8 q0 F% h; L
            server->upp_channel_a_recv = false;/// ^# U1 k- r* q4 M# p, C% U* ]6 o

- I9 k+ e  t5 t) Y& X' r% P            server_msg_send(server, APP_CMD_LOG, "upp recv: success");. d9 [" o6 I; J* k/ ?& M$ D* O' k
        }+ p, d" J" W+ t/ g2 R- N# V
    }" d' ^, o2 ?  w9 v: w

0 Q+ `. z* {! P: a& H( U# q
! k; {0 L  w- `$ R+ K% P# v    return true;5 k- h: d6 |1 S; J" {; o
}, H& B- D+ B/ }+ }/ X/ u
+ V* X1 H3 \8 j! y, Z7 a* g
static bool server_upp_data_send(Server *server), _% e5 A+ Q  e! p
{' E8 x- \9 n8 z; n
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! V1 `5 I& s0 y7 t3 s7 v+ B: r
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);' n3 l+ X" |+ N% n3 R3 s2 q$ Z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
1 \9 A* a. a- f! M2 [6 P, ?        char tmp[128] ={0};3 {' T! Z9 }4 d- w" m9 L2 K

& I( y& O/ b; P0 K. Q" A( P5 E3 z        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 {) i/ x! u! V1 y. c        print_log(server, data, 64);
* D0 ~( u4 O, F9 f
& s( R8 \2 S6 J1 b# l0 f        //" {3 G% |* D* s; a6 r
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);. T) s! {* U9 [
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 r& J3 V, r5 y6 d; {        print_log(server, upp_buffer_b, 64);7 j, _7 r; t0 k" X6 _
0 F! f9 r/ q# g! i  e' N6 y2 a
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
8 q* l1 S, x  |3 D8 T        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! ^* R. P" c% Q
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
# E" M6 W# v& s# N5 u1 u( P) V' S        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 \! g- H3 n& }( y" `

! \) [. ]* x! K/ e! `9 T# f* ]        memset(tmp, 0, sizeof(tmp));
- H9 }9 f1 ~% I6 D1 m- p" v        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ A5 c. d8 G  p& }            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' \4 q- y5 J" ]( v        server_msg_send(server, APP_CMD_LOG, tmp);" B2 R3 j  @; ?

5 |1 T8 l6 [9 z8 r0 m8 m" I, ]+ s        upp_error_count = 0;! e, j) k) S- o  E& {
        upp_dmaq_int_cut = 0;: G: x4 J0 f5 y; w4 ?
        // fill in data 6 [' W, l7 d  i6 a7 b
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
: a( q: N- @: B9 v( x9 B, p        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");7 {# V! L8 V/ r) _- R( f
: x3 l8 V! m  n
        // wait send success/ v3 t, }5 T/ E( y1 f2 b* D3 [# k: W( J
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
1 J# _: X, V& b: W1 F" q( q6 i* }6 L" A) H. D% |
        // make data node in free list : E8 t- M% r: G) c. x
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- d/ r7 S5 R6 q) {, s6 Q) H) H
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
6 I. A4 L- f, V7 t) ?( t    }7 r2 `/ W/ {" G& T
    return true;6 F# J& ^3 w$ r- {7 \
}- E5 X# |5 w% K- b! Q' x
5 h: @8 y% _6 l( j* A/ _' |- A4 D. O

$ Q& B( R3 W5 E( H8 M8 L6 I0 e- d1 B: t, r( T

+ p7 |5 l6 B8 E1 |. O$ g" Z' l# ^/ v* y$ ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
1 R! `% G4 C8 K. [
" i$ s5 A* V% O# b: ]# {7 V8 ]

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 16:06 , Processed in 0.054832 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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