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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 * _. K  F. T7 p+ U& Q3 }
, G0 r0 {1 b+ m2 m4 q. I6 d
问题描述:$ g3 O# K; c" Y, O* H) \0 E
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* ]. R% Q! r7 C8 Z/ h% ~
; {2 w9 w+ H6 J7 ~5 V3 b9 b8 A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) g; j/ ~  g; s( T

4 D$ n' ?% K' U8 U6 p6 f测试结果如下:
, X/ q8 Y" D3 B/ h) |5 T# @138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
0 R6 O  A( e# A% L, ~) J% H, p: x$ F. i

+ c' \8 m& y, w5 s备注:9 \. K+ W# v7 @6 t/ B( A
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?- r( I3 r  S) n- c9 f7 _. u
2、相关代码如下:
$ l0 i) J6 i5 k) Y3 W. o0 v//UPP DMA缓冲大小512字节; s8 Q: Q8 T" s9 c# M
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 n; D( [9 }3 N4 n
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! S4 }' B/ F0 A: g& j; A6 R: Q5 Z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)* Z4 h, D0 n) U' A2 l
/ |8 Q6 A) X' Z% {: k: ~

9 D) o  U# v, o+ q3 Y( B3 I//upp接收、发送buffer; T& |4 g/ i& @& H
#pragma DATA_ALIGN(upp_buffer_a, 8)
! K5 L6 M0 P- D/ D1 D1 B#pragma DATA_ALIGN(upp_buffer_b, 8)
8 H5 G+ S& R7 |  n  L' U$ Z
4 P7 y0 y, I' N5 x6 T: uunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];& w; L: @8 B7 Z4 K  `
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% q  s3 m, ?6 b6 V+ u
; t; ~. S6 Q& W0 g% |" \. B6 o5 H9 U# N4 e
static bool server_upp_data_recv(Server *server) & m( J% @+ h: O+ i6 _
{
' W. Y) N% l  |* H    if(server->upp_channel_a_recv == false) {& u0 l' r2 G; p/ d( r1 d
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
2 E2 a1 z' v' e; W- ~, R        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 P- j# L2 g/ w+ F7 w# J
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 X, D* i; r! [6 I( h
2 w# u5 q8 _, o8 }9 p4 i# ]" K
0 Z% |: k" C! h, J+ P4 w
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);" C" Z; F* N6 V0 U# f, D, L
- y# h% r  O. J, I8 e3 h/ c7 _7 @
            server->upp_channel_a_recv = true;//  i( J, `& q) V; R9 _0 W4 l0 M* ?
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);6 c- M9 N( o/ V
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;$ b  N/ F* Q2 t. X2 `' O$ c
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' j' H$ y7 q' U# F& a" h& B
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//5 a/ h- p9 B3 N1 x
5 @! `" G1 Z. @* `( ?
            upp_error_count = 0;
8 Q4 Z5 _$ M. v; u( R7 Q! _1 k            upp_dmai_int_cut = 0;$ E9 M7 t4 R7 k- h% J$ I, F7 ~

0 b6 w2 Z6 M. H$ M4 j; ~! f            // fill in data
7 K0 a) b. E/ k9 i, T6 W            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" t1 f4 W/ k2 A- E/ q& e
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 O$ j  f; ?9 n! m" ~; ?
        }
: O  R, T6 d+ j1 [+ `$ f* a    }
  q3 P3 u' X4 C    else{* r8 |/ q: b9 u9 B! @5 i' u- S; @
        if (upp_dmai_int_cut > 0){
: k: z' G  _1 X; |$ f            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, g8 N0 C2 O7 v2 z$ F
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ d8 w; P9 x3 Y4 ?( w5 P3 F5 l1 w. H3 h5 p+ `4 f
. q0 J6 H3 W. |" \6 P
            //copy data to upp_recv_list_busy6 X, }) x- ~2 ~7 W
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ _$ O) d, S& h1 [2 G. u$ U; p
: `! D+ N! ?. W7 B* L) Q3 A: h# m            //# x9 Z, Y" m0 n
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( {' ?/ a: ^$ q( }4 }6 m$ S% [1 Z& S$ c- z& U+ V+ M" \
            //
' S2 J4 Q0 o$ o6 M" K, n            server->upp_channel_a_recv = false;//
& F+ |9 D/ s  J/ K  ?/ _& l- B$ Z0 K0 q! T5 s. I6 a/ Y
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");, G7 ?. C- `/ l- k+ }" ?
        }, K8 R' J6 P- ?1 q
    }
+ y8 E0 U( m1 T7 h" e( n. p0 e
3 q+ B! U. q! X( r4 M3 R* L+ A' z, P6 ^9 R
    return true;0 l5 ]5 B/ I7 X( _# d5 i( Y
}' I9 x# ^* T; ?2 @

; Q6 E% a6 i" n; y, s5 [  }static bool server_upp_data_send(Server *server)* ^8 Y4 A/ V. a9 q* `8 T/ L5 J
{* l" I( ?3 y5 m6 X
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, y# C1 u* n4 {8 _% x' c8 s        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 E4 ~, J% B: `. B3 l: \: y        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
4 H  A) |# \; \- L* L) n+ ?+ X- X        char tmp[128] ={0};* Z9 g2 k: X$ p
, J) ^0 D+ c& P- o$ ]3 o+ U
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 k$ H' [( t6 [7 O        print_log(server, data, 64);
* G1 A. M8 K. v8 c* M% N1 S7 l: r
0 }, j' ^. p* h7 v* S' i        //+ J1 M% _- s: o/ d$ ]
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
( I6 u4 Q9 H& y! V. P$ i        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);5 d6 j) t  L7 q2 r, t; l+ Y$ X' |
        print_log(server, upp_buffer_b, 64);
% R9 F( r, F7 K9 W/ b* ]) T  N2 U1 M% a& I3 C; ]
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
# p9 o, t; x1 e, ]; e2 O" K) S        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ' L% C# ]( w: ~0 Y
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
) T7 v* ^+ I# ]- V        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
- @' ?; I' @: @3 w( A. p  q; y3 ^0 |
        memset(tmp, 0, sizeof(tmp));" d  x" y7 `9 E
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
# p, W- F0 ]0 {3 k7 t# H9 i2 }            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( O2 K) h7 ^( ~  b" I1 ^
        server_msg_send(server, APP_CMD_LOG, tmp);
/ H; h( Z0 w+ I1 \; \, {8 h/ y$ Z& k  Y6 w4 e4 B4 l* M0 q
        upp_error_count = 0;
8 C+ j+ `4 W! Q8 S: P        upp_dmaq_int_cut = 0;
; N5 Q: v3 p- i3 r% m        // fill in data
& P. |% y9 L3 f- D5 ~: l" j7 y" `        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 5 |6 }/ r! X/ b* V7 U
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");6 {( h. Y' R+ A" a7 k; V

6 R& T  b* G& Z5 u- v        // wait send success
5 A& J  ]; H+ p        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! {" ?7 P  ~% {& s  d
% U2 f6 |5 L' t7 u8 j& W
        // make data node in free list
5 ~. t" }. f! o  H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# L; Q% P0 g: w* e/ i0 I        server_msg_send(server, APP_CMD_LOG, "upp send: success");; F/ ^; r# f2 e! C& ?
    }
& a3 V" p: s! L% {# }' ]" T4 }    return true;
6 \3 Z- ^, p+ C+ u% A/ i% S}0 {- \( ~& P/ a( [' S1 T
1 I: L5 N8 v3 K5 O
/ L8 \. ?1 M( v/ T) g9 b3 N

% g, C: {* s# R# q; Z: W

- c% x. V3 g4 H& h/ G/ _( o* ?1 Q1 w1 e+ ]/ A6 u) @( Y" K

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
6 d* F5 f# s3 }) v  y) r& u
  Y- U2 U+ D7 P+ B* a9 _

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 04:14 , Processed in 0.042431 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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