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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
6 H1 {( W" Y- ]! i: ?' p- D9 O$ F+ [; Y8 I! d$ v
问题描述:
  S( X) [: Q  m& G在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 s4 {, y( |% {' V) m7 l

7 _" v% f2 r, q* a图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" w( n2 Y, z, S4 R$ U1 `" c8 l" c
% \: \% G$ i! o3 ^6 B测试结果如下:( O2 Q5 e; d' j( K% h# h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?4 E4 F; }7 Z) d

  j4 D$ }( e7 e$ h
0 h: A' O) ?3 h. D5 d' r$ i' X4 S备注:
' k' R4 Z' W' ?' u1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; m  F: ~- x7 d7 u6 F
2、相关代码如下:
/ j' r- K! d7 p6 m/ O% c' \/ A//UPP DMA缓冲大小512字节- G1 y2 w8 V% A
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; f* q! K  ~' `: g, g  y
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; s) F4 ?3 S" |
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 W( i/ H) T- B
7 L4 f( _( Q5 e: F/ @
' F, ]2 T+ W* `2 ?. `  s//upp接收、发送buffer3 w! X0 ?4 p/ J: q3 `4 }
#pragma DATA_ALIGN(upp_buffer_a, 8)
& N4 ^2 ]* s, R2 g#pragma DATA_ALIGN(upp_buffer_b, 8)
* l$ n/ a! F, u  E3 j/ d
/ H  }1 g- Z2 W+ a' ~unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];. Q/ b) b/ y/ _
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
7 r$ W# q8 ^8 j
/ S2 j" ^# L/ l$ _: r7 t( s) L& B. m! {6 y2 ?# ^
static bool server_upp_data_recv(Server *server)
- E# F) P* r6 Z$ _! Q) _{
: s! R3 O+ U# Y    if(server->upp_channel_a_recv == false) {/ O2 Z4 [; s1 w# k  W+ w" {6 E
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 [2 e+ v$ L. B7 y4 ^7 ^7 e        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {; }- l; W! J/ r$ L, ^* }* G+ \1 _" j1 a/ N
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- z! |; S6 j5 a! t3 n$ T$ K# `
3 _1 L8 K- @2 e# f3 W
3 I) l5 w1 N( h
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
) C5 u4 w  _" S3 Y3 \0 B( C
6 |0 F0 ^1 G/ Z            server->upp_channel_a_recv = true;//1 t+ b# o  C4 q  ~
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
5 s) w, [4 M! x0 m" B/ A            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
6 Z( U0 s4 v, l6 s3 ]* y' j9 M, r            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 ?/ r2 W" ^. }, ^- V; @  h
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
) J. P* D7 A8 z7 ]! w" e. A% v* t, q, g$ p& i/ O
            upp_error_count = 0;
+ O8 i4 R5 m  V2 {; J/ a            upp_dmai_int_cut = 0;( x$ m0 `- y0 a5 S
& h" E7 V& f* I
            // fill in data & T8 i/ p( L9 ]/ D: f1 d
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);/ |. o: l7 X3 ]0 g7 N! J5 O" h
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");; S. Z2 h' p  O3 O' ]- I
        }1 U" c6 p' |! E
    }4 Y: f- K0 T" o
    else{) q) ?+ C* f3 m: C( e
        if (upp_dmai_int_cut > 0){
  ~: |/ g, t- v  C( C: a            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ j) A7 P5 D2 w
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' W  e% @) w' v% O8 ~7 _: \
- V% ]9 ^6 m3 j( S& o& K; B0 J7 W
) v$ v0 X. ?+ K3 K7 Y. M
            //copy data to upp_recv_list_busy3 v* @- `4 Q# v; R6 ~8 O7 Z8 v
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* `6 u/ d$ }  t8 H# x* s2 L

* e$ [4 G) B# e5 T% X            //; [5 M2 U( {7 y) d- j2 l
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);0 n6 Y% n  v4 @& D6 a

1 T; L3 l. k0 }; R            //: E/ T( z$ p1 D7 E! ?' y
            server->upp_channel_a_recv = false;//
8 r& E8 H3 E2 m" e
6 f( G9 v4 G  F4 [            server_msg_send(server, APP_CMD_LOG, "upp recv: success");) W3 b  n+ j/ Y* X5 Q, a
        }; v- P* w& p! `" l9 b6 {
    }
& F$ F7 l1 N# ~* L/ b4 a% Y# u: z& W; M% z4 D, z" ?3 e0 f

9 C3 n0 V& D8 E1 ]( R. }    return true;
8 E) {  A6 w+ F8 b+ f/ J" k}
+ q: |0 T8 I# O! t7 W" N! r) X. u8 X+ w: T. M) @( Y0 s) g" B/ c
static bool server_upp_data_send(Server *server), ?0 ?8 w- f1 d) Z3 o, O
{
. ~* R6 z7 }1 |& c1 G" H; K7 J    if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 e" L. B( D+ A2 b& K" C
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
* W# e' w  L( B) c7 a        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 l# }9 \0 f, {        char tmp[128] ={0};
. A5 v9 b  ?- h8 p, J% _# u, j
$ ^# x- t2 K9 }( A% B# r        server_msg_send(server, APP_CMD_LOG, "upp send: start");
! L, ?8 u) w! ^* U( H! c        print_log(server, data, 64);
! O; r9 q$ d  ~; e' Z2 O* ?( W% ?1 ]  M: \4 A9 y
        //3 {( y; Q) Y+ g5 u; d! B! i1 R7 k( ^: [
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);* w7 G$ W  Y, F7 x6 {( g" M, u
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
7 Q! Z8 `1 B; i7 ]9 v* v        print_log(server, upp_buffer_b, 64);+ c* R- z9 b$ X4 |2 [
% H( p! L1 U; U- t3 J+ Z
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 ~% E7 ^/ \9 i  W        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 X. k5 d( ?7 D        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 @7 z) h6 q- [0 y
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 @( g; \* @. l8 b, u) J8 Q) C( f3 J( S9 S8 A) c+ {4 K
        memset(tmp, 0, sizeof(tmp));8 I; D1 y+ Q$ e$ [
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( I  [$ _# K/ V% M* h6 p4 Q            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ i" h$ D5 R; I
        server_msg_send(server, APP_CMD_LOG, tmp);
  _! o6 H% N. w
% V, e; n$ x6 n# E% l: B5 R2 \$ n1 ]        upp_error_count = 0;
7 h/ k% J  C3 [: S& d: {: ]! h        upp_dmaq_int_cut = 0;
! s- [5 A, b1 V5 Q. Y1 G. t5 y        // fill in data ) l1 ]3 T# M. Q! ^8 t  Y
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
6 j; ?* l9 r/ e) m* M; V2 C        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 |! S" L3 K9 Q+ t. V
- q+ P8 C4 D( f* J/ D
        // wait send success9 R2 ^( Y% P1 F$ J
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
2 o/ r) V' P9 a) n# C3 w9 t; |$ g! }
        // make data node in free list
/ ]/ f& ^( }# }+ t        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ Z8 j6 \$ z+ x' W( O4 r
        server_msg_send(server, APP_CMD_LOG, "upp send: success");8 v, }+ o% ?* p& x: H
    }
# f  p, y% k) T# B5 T    return true;
6 Z; H0 m, n3 l, k( }3 R/ D}; I* C; K! v! V) Z& m1 ~! @* _

; Z& t& R* G$ O6 ^" B
1 q8 m! l# L- n) Q& F; M8 P% c

  ]/ P' {0 L9 C: c" X1 g
/ p1 r5 N- v/ J8 s8 N+ e
5 ^; y. g' \  `* @. {

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
. r& [7 l# R! w% m0 f1 e) P; G! |. |

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 07:33 , Processed in 0.041175 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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