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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 h& w* H9 n$ D9 C  M

# I% S' s, ^& B5 `5 F问题描述:
; o9 x- z- t9 k4 x* Y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
9 f' ?) E4 d# ]5 k$ L
! N. i7 W# {7 f- y; U) V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 }1 L' {9 X: B7 t7 U% Z2 i0 Z+ r
2 r4 h& Z: m! ^, W% u) S测试结果如下:
) r: p+ q) t) v8 G138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 _% q9 x- ?& X3 I5 `3 ]
  H! c& S9 H. J9 `+ J* G& v3 g6 p0 O2 U( S( n! T
备注:
) M! q* q1 x6 J* ^# f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 X1 o3 o; N2 I5 `  t8 L
2、相关代码如下:4 ]2 @% o2 ~; h) c8 a. e7 ^
//UPP DMA缓冲大小512字节+ c/ S7 g, K+ F  S2 x
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" Y; w/ k3 b7 u1 g6 X5 }
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
* w# G- B! b1 G) ]7 B#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 e/ q# D' R& L) S  b) z' i+ F" G
6 c# g# [: X% M8 K) K$ u) J0 [1 }

$ J' P: {6 s& _7 A2 }  p//upp接收、发送buffer2 \6 \; t% G7 J/ S3 j
#pragma DATA_ALIGN(upp_buffer_a, 8)
( T) L) A+ I6 g# I#pragma DATA_ALIGN(upp_buffer_b, 8)2 X+ e9 [& K" Z
/ H. }% U2 o* d0 j8 N: \) \$ k
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
& @# J: K5 I$ A5 v/ Kunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];6 c0 I; v/ |: L6 ~
3 r2 w+ ^$ [- V! x

; v+ O, i4 E# \6 Cstatic bool server_upp_data_recv(Server *server)
" A4 U- s! L; ^{
7 m# u; {5 ~) Y* _/ W    if(server->upp_channel_a_recv == false) {
2 c, e+ x. E6 T2 F; T6 F        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# ]9 S/ n* U1 k) A* x        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 D/ W8 G. T2 {' `; e! p# n" t
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 A! n) G6 r2 Y9 w) U/ ?' e
# b7 J8 p: A+ c) |" M5 e, @0 l& a* d9 [& D
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 g$ t, t7 E. h' ?
; P. x: B  s& O' b6 E, z( A            server->upp_channel_a_recv = true;//: E$ R& G$ ?' o& r1 G* k' m1 }( ?/ s
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);" j# b) m: [. f( i0 T; V5 z  Y
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;: d8 o0 T! [1 F/ u4 W
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' k0 C6 l  Q( y& }9 p$ G
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 J7 l4 X5 e1 \
% X! i8 s, O% f% R; y& A            upp_error_count = 0;0 o$ Z% b. P' L; s  B. w
            upp_dmai_int_cut = 0;& z( \8 R' a& B* i. t, m
3 a1 m+ f) `6 p% J
            // fill in data
, e2 t, o4 \" m$ |( h            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 p. b; \* y8 k* h! I+ k            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 _9 i( o+ Q/ _% s+ B        }" C. r* H+ j% P- M& `% k3 x* }
    }
  ]) j2 n; K1 C2 [4 \/ }, Z    else{
( Y- q( y2 B6 J" B1 U0 W        if (upp_dmai_int_cut > 0){
& u1 T' |: z# `$ F            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
4 Y9 @' z2 Z/ G) _$ W            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);( P% k0 o2 S. J

2 ]0 n) `5 J0 w: B& o
, Z9 X' ?+ O0 F' Q            //copy data to upp_recv_list_busy
6 u7 ?5 [* J9 @+ Y, c            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; j9 r6 d. G; X) r
. P8 ~# m; v8 t" V9 a, g+ }            //
3 @" H6 i+ r; R            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);1 e1 v6 v6 O5 w; s: e; r
8 |1 U% h9 ]/ H; z' w3 O
            //
1 T& p: R8 V! Q8 `$ H            server->upp_channel_a_recv = false;//
, u2 g6 S9 l/ K( g7 _, D
4 B; }) r: c7 Q1 z! J/ o            server_msg_send(server, APP_CMD_LOG, "upp recv: success");: [8 Z7 _. X: v9 n7 K' T
        }( ^6 q( d% i) u) {6 F7 C- [% J
    }% k2 |2 b/ l& {- [
7 n3 P; k; E( B3 c. y- W
0 a  A) a- [8 z: z
    return true;
. C$ F- g! k6 a}
1 p' [. m. T4 G, Z0 t8 y. |/ J& M0 I) z' V  G" O  N
static bool server_upp_data_send(Server *server)& g5 F* J2 ?2 e
{; d9 s1 s- D# M2 d* J7 Y4 g
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: `6 D; Q( o0 w2 i5 [        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
3 D1 [! |/ v& C: w: [        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( o* E  q4 k: @. a$ K, m' `' D
        char tmp[128] ={0};0 E7 K8 x/ z* f2 Q) a1 b
0 t% Y  s& L6 Q! W# W
        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 x. F! L" C! X( Y+ z3 A
        print_log(server, data, 64);/ v; M7 Q% }+ E" X1 I2 O
2 u! c/ \* R  |  M4 @* H1 E
        //
. Q8 ~* D1 l6 a8 c0 _* Z% D        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. E0 _1 T4 ~/ Z6 C        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% L9 A, t! Z% U& |) r4 H        print_log(server, upp_buffer_b, 64);
6 Q9 \, c; Z7 `% G; }
: h0 @5 g* r# C  x: `        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
* ]$ {& J  g; S        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
- t6 }9 U/ ^0 `' y- m" R4 a& s        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
6 D! r( r& J: d1 O+ K! r6 O        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;$ q" Z1 F* D2 G. p  |; w
: |5 d' g" ^8 {. u% x- L
        memset(tmp, 0, sizeof(tmp));5 X$ h( \* Q% P
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 W6 x4 k3 S2 Y, ~1 J$ o
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! e, p/ m+ s( z9 t0 N# ^' v
        server_msg_send(server, APP_CMD_LOG, tmp);
# U8 G. s* `' D  G  o" r9 ?
. a' ]6 o4 y. Q" |+ Z( {        upp_error_count = 0;
( e! K4 `2 n2 m8 G; G        upp_dmaq_int_cut = 0;7 S8 Y! E& ?0 D
        // fill in data ) X+ [" O8 P- n3 S  S6 r
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* `0 }# K- {# i5 I        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 J# O+ @9 ]  I! s$ J' j5 I$ |! b& x
        // wait send success
; M/ T# i; U+ X( j9 a9 w0 ]1 h        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 d, U  u$ K9 |$ B. H
1 d8 P& |# P& o' T+ R9 b% t% p( E& [        // make data node in free list
- X3 S. [9 X. m  o1 ?        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
4 ^2 `6 |! ~+ Y8 S; ?        server_msg_send(server, APP_CMD_LOG, "upp send: success");
" v* M6 y, H5 b- n) K" F    }
. }: D  u& \- N- d& \/ V+ u5 G    return true;; j5 ^9 W/ z9 w; W4 ]# ?, K2 \# O2 d
}
: u3 R9 _* R' a$ _5 K  k3 V( n& f, n3 ?/ |$ {5 E& i( K

1 R+ F6 P! f$ z) H
! A* |3 i5 c: z: l

$ v7 \! x  g0 E3 D  ^" ~
5 z3 K9 A& P( L. G

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐7 @& k2 r$ l4 g7 Y9 w4 I: _: J
! L% {9 V( V+ D; q

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-5 17:04 , Processed in 0.042329 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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