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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 w3 B) y  `. b; u" |8 Q

* z$ R! c6 {" p  L% E2 p# G问题描述:$ A+ }2 u( q% l, D+ M
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* G$ `8 b% y. U- I, \& z
! q( C% y2 c$ n  x) T, S图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
2 I& h8 \. C$ b' m* [& I, m- I9 Z  a& H
测试结果如下:
: K1 A5 i7 _6 _4 T9 h# o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 j/ ~3 h* m; V/ {8 F
  E$ [1 o+ o) \4 F. Y% B0 z
8 ?$ V9 E. }# x( ]$ a备注:7 t: s/ K. }! b( D$ p/ {/ f. e
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
2 Z* n# ^5 H- P. [- Y
2、相关代码如下:# n" W$ Q/ h# a4 A* V! ]
//UPP DMA缓冲大小512字节
% e( [* y4 P3 F5 m7 P' C#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; T/ N- G: p; U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
4 u2 p3 O- q+ E#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
9 ?% l( h$ K9 \3 E4 M+ n% v, P
/ B1 r# V* `. y
//upp接收、发送buffer+ R1 ]5 {9 a0 B& K8 \. t
#pragma DATA_ALIGN(upp_buffer_a, 8)( z( H# R% `$ ]: H5 u  e
#pragma DATA_ALIGN(upp_buffer_b, 8). l& }7 e' B0 x3 h
" x# {& ^  p3 D- e1 }- d' K
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 l1 T' U9 q( B6 S* t" q) ^. ~- z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; n" `4 k4 y1 w% m: }6 k- S+ p1 z" e4 h! A3 U' j/ [3 v3 v. H
" w/ \  T+ e% _7 C/ m
static bool server_upp_data_recv(Server *server)
9 [% Z' n+ T( Y+ i{
) ~- L1 O' W. V    if(server->upp_channel_a_recv == false) {! ~+ \; w: m& w* E9 \
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");0 k) Y9 g6 G) L* l
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {2 n1 z' d3 K( }+ P
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( Q4 p9 z* t5 O6 _: G( g7 d4 q; f) i/ U9 R3 {# D
! }" F" Q# R; e+ i- @1 p  k. @# v
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);2 @' @' e8 x  t7 r7 p* `' m

* |7 `' J* X5 I: C. u            server->upp_channel_a_recv = true;//
# _) g. L0 S$ V2 X! w/ U8 x- _+ l            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
9 L2 f$ N, y$ Q: n8 A3 T. u            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;9 A7 Q% q" K* d: @
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! t7 b! W; ]3 _2 F( ^            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# [& E" [# ~/ b8 h8 g% t% N% x
9 t5 W2 W$ j5 O* g. V            upp_error_count = 0;
- U% A$ d. W* t* r% A( f+ F$ `2 g' \            upp_dmai_int_cut = 0;, {3 T+ Z# R" a: S4 F% u

9 z9 `8 b# o. M* m: R            // fill in data : Z: b& E# }$ @) s& n5 Q& h, z
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 Y% b( X4 x2 U/ h4 @0 H            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");* n, {0 a* C; ^6 Y+ ?
        }! F% m4 S5 N9 K3 F. r8 j/ |/ n3 _& X
    }
- A( a/ _7 Y8 O3 [+ A: K$ Z    else{& H) g6 T8 S& R" H; C2 x& `0 e
        if (upp_dmai_int_cut > 0){9 g% L5 v4 ?) x4 S, g; v
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 G. l/ d/ ?. K
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
  ?6 T- B3 e' A
# A/ U8 S  x' t9 ^1 n0 B: s4 |% t
            //copy data to upp_recv_list_busy
+ r+ v$ _6 o. p2 @: B, V  n, k            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
$ ]  y! o& `% x6 l5 S1 o2 N; r  a" I8 ?! G1 d" C( I4 }6 k/ @
            //
8 r9 e2 J) Y! \1 B& Z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% D' n; @, ^9 U" R5 Q- e. v; b! V  m. l2 Z) v5 R' j, _9 }2 Q' m
            //' J# e0 \8 O: i
            server->upp_channel_a_recv = false;//$ m. ]+ r1 a2 o+ q! P
1 p9 g! t% c# A. m5 {7 E1 ^; E
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");! u+ l* Z3 j7 W9 m* p% f. O
        }
0 z3 S% Y) Q% n7 d5 z# e0 L1 c9 L    }
# s, g# v! |# L: Y4 r, M
7 T) y1 F( N$ @7 U" j7 X! G9 m1 {& \; f, e( u+ o& q' x
    return true;
) b' V) }5 k4 q! J" a  a}
3 i/ r% f+ N& w; h/ j8 B$ Y$ d% p# S+ [' [- h6 i( v
static bool server_upp_data_send(Server *server)
0 m6 i( ?+ S3 p{% q# g& |3 w  x+ M; S  X
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
+ ]- l) \% ^8 M$ X/ B8 c        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
9 X6 x, \0 l4 E7 `; O. ^% I: G        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 C2 F2 `6 X3 y' P- D( C# }/ X        char tmp[128] ={0};
( J4 B& `0 Y" ^& t( b0 g: Q5 A; Q/ `6 r3 Y6 ?
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
) u/ t, V7 ?, s' d        print_log(server, data, 64);
+ d# u! O' A3 q! t/ K# N1 d4 M! N7 z
9 W6 D. J& B% g" v2 u        //
) C, C1 C: a$ E) l* Y- G+ A, u        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 \7 a6 A' T$ U6 T$ T; S
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 @0 F! A8 [1 o0 S( K  O
        print_log(server, upp_buffer_b, 64);0 q$ S( S; j1 M8 W

8 d0 F5 V) i  U+ o5 x4 G9 \        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);, v% e1 ~- e$ l* _+ y# Y! @4 Y# N
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
  T! s, e) |8 H  Y1 e( N9 w8 l/ {        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;* ?4 Z: q1 ]6 ~4 b& ]- [3 y
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;9 h3 F& z# O! w5 c5 g

5 h% n  b1 N$ B$ K        memset(tmp, 0, sizeof(tmp));
$ W2 @+ [& y$ s        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% b- `# A- E/ Q/ W% c; d; b$ ?            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' @5 t* O' R: @        server_msg_send(server, APP_CMD_LOG, tmp);0 z9 E( m* f, B" K, p$ |
" U. ~; R- D' r6 \
        upp_error_count = 0;
( b2 ?0 `; o0 m2 F        upp_dmaq_int_cut = 0;
* N2 t6 p/ f! s* [7 ^4 Y. J        // fill in data
2 s- C$ ~8 B- {* S+ M3 a* ^        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
3 L% N! x# l  h6 d1 S# n        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");1 h* x( n8 f2 z; C+ P# d& g5 k

1 R4 d6 E/ |6 n, M6 T        // wait send success
. Y8 _% m; n1 z8 ?: k% }2 Z" b  _        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + `& E) }' z+ \
  N/ F7 a" b+ a+ L- c
        // make data node in free list
  ^" r; |! v0 ?+ k- g6 ~8 N$ @" X        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ m4 L# f- N2 J9 E4 I  `5 T; m& R
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 f$ y) G# d- l/ T    }0 |, b- _9 M2 o6 l9 ]' L/ g+ R
    return true;) l8 E4 }) {+ ]
}: p6 @7 V& |/ B/ s! Q( n' ^
& R! R, [6 D# B# O

; q: K9 n% @6 }4 S8 e3 ]# Z5 W1 @' u& D( V' t( Y. F1 `' ^! k

1 }9 W/ y# s5 z+ \4 |1 V0 W% u5 c9 p9 q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
8 q* k  t( i7 D! B5 G5 h! w' W* k: M: b9 R% m& f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-16 22:06 , Processed in 0.047740 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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