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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
8 X# v/ T/ A* W! w# z
% `' ~  A0 }& Z7 [1 k问题描述:& g# m# S  f: ?# q( m6 I
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 n: U7 v1 [  r$ H& `

8 N: Q, N) U4 K6 g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 t, E2 a3 N: Q# X
7 k8 B" L7 u% `- ?# D测试结果如下:$ t8 l0 o1 x8 E3 O2 s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
/ w6 O) K6 c- z
8 [+ k9 W( U. K! n* b/ T2 X; H$ D9 {2 ^& W1 ^- Z3 o
备注:4 i- `' b) g1 l6 H
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) I& P' N+ W- Q) z: f! m1 H
2、相关代码如下:. b' k( |" {4 r
//UPP DMA缓冲大小512字节3 Y+ W; r" @+ e; a* g8 T, y* Z
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: ]3 a$ \* }* [  A#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
3 K* h: Q. D; n# h#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 x6 q5 s# f5 B+ e& S4 [# A8 ^

5 q  [- t; F/ Z( k3 Y& K: q. ^# z; o9 k  ^
//upp接收、发送buffer
% h! s: L4 Q& \9 P#pragma DATA_ALIGN(upp_buffer_a, 8)
+ q* o; Q' q5 k% ^#pragma DATA_ALIGN(upp_buffer_b, 8)
1 d" e( K" Q9 m* ~, b& K: \, H, y
! y; h+ j0 W" g( Tunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];& z$ n8 p4 t: b3 N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 M" `4 `3 a/ V- {3 n
; s/ f( `9 _+ |/ g( p1 [) L. |' Q% H. L( S1 ?/ e/ d) n
static bool server_upp_data_recv(Server *server) + o# P. k/ p' U1 y1 o7 N- L
{' X4 u6 z' s; `2 e1 L$ R$ X4 b
    if(server->upp_channel_a_recv == false) {
" m( g# t# J2 F7 p        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 J* `. N( e5 i3 c+ y- b        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
1 R6 e) t8 {& f, d0 z; W' Z            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");  }$ ]: T/ @: b0 m$ |
/ X( O% _) o. k2 {" u
" T* Y+ M2 e1 _5 R, u
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
0 M3 j+ h. @! G0 n: X" q
) o4 @1 Q! |( x/ o$ K; y* }/ s            server->upp_channel_a_recv = true;//* C" y+ _$ v3 C( I# \& l9 x8 ~# c
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! D6 i9 W9 K1 K8 {            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  G8 O7 n" e2 w" I$ }            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
3 J$ Y; r+ K2 E* i/ o. v3 x) O! M            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//5 c; ?# j% v  {, c  O: ~1 E$ i  F

, K( s) h  D9 @- }            upp_error_count = 0;, P$ O: Q+ R: `' T& [
            upp_dmai_int_cut = 0;9 ?' _+ i: ^' S+ h6 `7 Y
8 ?% M: K7 T* V& b) Q5 n# ?) R
            // fill in data
: @+ ?/ H6 R/ ~3 X9 x            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 }4 b% z! o; s1 |8 }" h
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- s4 }' G. w1 w$ v
        }
; u8 s4 Z# L1 J8 }/ A    }" d! a  b% p: S) V
    else{
( Q0 }/ ~5 y& j- X* V        if (upp_dmai_int_cut > 0){
$ z* \8 `5 D* j' }5 m$ z0 n9 K            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' p+ E$ d; l9 I' P; a: ]            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" L0 w* f' F5 R& ~$ h# D5 `
. |9 G9 o- z, Q' T2 ^4 {2 L( c

" S3 i7 a% H: ^1 N! m( _            //copy data to upp_recv_list_busy
: b6 Q" [/ L: {# _1 l# J            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);  U9 [* Z, M: h4 r1 {

8 u) V# Q9 J! N* s* x! h& |  Q            //
8 _9 w+ @! ~* Q9 k/ r            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* X+ L. g- M  N* I+ ^, {& ~* ^2 g" H* |1 l& b% {8 @' q
            //
% h  Q( X2 o/ ^0 Y" ?. ~            server->upp_channel_a_recv = false;//# @2 L  X; e, S1 U

0 ~4 E$ l6 U: m/ V0 h# C            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: R1 a+ X* d9 i2 Q0 E        }
: p  C- V  D8 u0 T    }
1 _& }6 y2 Y" n5 a% J; }% p$ P; V6 P
+ F6 `; o% E8 m0 s
    return true;
& @! \3 R  t* \4 d; B) s}, ]; w) T( s) j: L7 x
8 @% q6 T3 u: W6 l, u' Y2 S, ^
static bool server_upp_data_send(Server *server)
% p9 R& J5 i7 N. g- M; ^7 m{7 Y' y$ T9 B% P5 ~; V
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" T& `4 U& n  t        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! c* q$ P5 G0 Y: l; p3 k3 g! Q% Z8 F) ]
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% e# F8 J9 k7 V% t0 Z( |7 j
        char tmp[128] ={0};- F* A6 e( d% v/ j* u& y

- s) m# E. @& d2 a: z# ~/ w/ H% d        server_msg_send(server, APP_CMD_LOG, "upp send: start");/ ?% R1 g8 b) }+ n& S( p3 b
        print_log(server, data, 64);! G% Y# |; h* h

; X  V" B3 b* v/ d9 K        //
& \6 s" b# o9 U9 y        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- Y5 }3 ~; m5 O/ d, t. g, H        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) q: I/ N9 z) J        print_log(server, upp_buffer_b, 64);# N4 g4 M# D* U. ?7 ~9 n6 U# r
5 e+ c& ?8 ]1 _) q
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);$ ~& v* _, q6 k: V) y
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
9 Z8 t: J) i" D        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
1 O2 {  Q/ q1 F5 ^; s( R$ p: K/ f2 V        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- [1 a: Z9 b" }+ J' G) _3 |3 n
1 m+ H1 @- d+ H; i7 C
        memset(tmp, 0, sizeof(tmp));. }- B( P% q3 c
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & N0 W8 q" j* ?8 W
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; d. R0 K, O3 v6 f; L& M1 W9 j( l
        server_msg_send(server, APP_CMD_LOG, tmp);
; `- c5 ~# N- K' q  b0 A
- H2 z" u* [3 i        upp_error_count = 0;/ g# I# W6 x- j  @6 p) P% @
        upp_dmaq_int_cut = 0;
9 R, A  ^, w* W; e6 V5 e        // fill in data
0 [4 o' j3 T3 H        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 Q* F2 K- p$ h* }0 b: H: ^" c- `8 D
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
1 B8 y7 J  |+ Z: U
* ~; f5 ^! Q) ~: J        // wait send success0 L! u9 v( |8 ~7 _+ Q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 D# [! j- B) k' \' [0 i
# T6 E' i9 V, k$ [) k
        // make data node in free list % C5 V! w0 v/ c" Y9 T8 I8 |
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" R6 \: A% `4 R        server_msg_send(server, APP_CMD_LOG, "upp send: success");
  I+ I7 C( |( M8 V" o    }
; D; V' ]- J) \" d; [6 F2 f    return true;
8 f  S$ c, k% ?2 ?- f- R}7 F8 a, q" K& \2 Z3 ^. O. {

' o8 D- c+ t. P# s

* \: e+ }* K9 l$ n# U5 t/ n5 i9 P$ b" C

0 {+ E- m6 k+ [6 p! @2 t4 S( M0 A
4 {: }, I4 ^- i8 h

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
; W& F. [( R& ~3 m
: R) i6 V  R  [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-4 15:09 , Processed in 0.042441 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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