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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , ^( n  p$ I# p) r6 C5 f; R
# p( k& O0 f6 ^1 N8 A( l  s) }
问题描述:: r) {- ]  v: K) Q3 m5 W3 X
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ b, d3 o& M* ~. g+ C+ p
0 r8 s" u7 O, I7 l9 x5 M2 @, X
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
( l7 d3 H! `" N2 C) X2 b) K& y
0 B8 i4 A5 }, K9 k! l测试结果如下:$ s) X) w" ~4 O8 F7 a9 u
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?! R' _" o' S) W+ |: E5 d
, ?0 a# E5 D+ i( i) F
- m# W" A" @8 t1 ~/ x/ u
备注:' t& j1 Y* b. N8 v
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
! T9 E' ^0 t8 K
2、相关代码如下:
, [/ @! k# J# Z, \( ?3 |//UPP DMA缓冲大小512字节
5 J8 G+ R/ ^6 r8 U' H5 U; F#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍. k. K, x( F" r: U# a5 o
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
8 c6 ~, f. Y5 [- E8 s( v. Y: ]0 H#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 R% J- i7 P& K% \' R4 @

  T& e' T- `0 E4 ]6 Y, c6 O% u& p
* e0 j; Y; ^! T  [! S  r& S, T//upp接收、发送buffer8 d, r: `1 P  b- w" Y" q, G8 N& h3 `
#pragma DATA_ALIGN(upp_buffer_a, 8)
. ~. H4 M, o% A! p# F#pragma DATA_ALIGN(upp_buffer_b, 8)( ?) I: ~3 D4 V" t8 S
! E. C. z" o& g9 a$ D" @
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" T7 i3 x& {9 V; q" O+ ?
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" T' B% ?" p* G) s/ m( G# O+ G, ?' t
$ a; m0 q3 O2 k4 t* |
* D& n1 s! z( K/ istatic bool server_upp_data_recv(Server *server)
+ y9 |( }5 a/ O{4 t7 x3 j' Z8 u, d6 V
    if(server->upp_channel_a_recv == false) {3 I/ K4 Q- t3 `# R
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 x$ k& V7 V. @. P8 t# d
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ Y/ r  b8 s- U4 F7 ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 F0 y# q. d6 ^1 C' x0 J% I6 x' B# C" s( f  h9 g1 B8 {
( R& q9 u# ~+ |" A" Y
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ s$ o3 d) m2 d2 u9 g; q1 s
  m6 X) @# o( ?) }0 G, R
            server->upp_channel_a_recv = true;//
+ ?8 @2 D  S, N6 l$ p7 C, q8 s" F            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# C+ D6 P% R) S1 V- L/ ^5 }            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
5 L. h! y* M  x            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;1 C+ p. ^1 p9 K( t
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 ]0 K# N" t- W+ j) j, o$ y
0 h; ^4 ?" F. s/ B8 k1 O            upp_error_count = 0;
( v3 O# M3 M. L            upp_dmai_int_cut = 0;
7 p9 B2 @; W* \% L  ~7 S: _4 K$ j
            // fill in data + E2 D& c4 q- E# o
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);  Y& x+ a1 f; v+ F  `( A
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% R5 K: y! r' O        }
/ U# q! H) x% D    }
) i0 N" R( x% d. a    else{) y; K# _, u$ h, t+ ]9 t
        if (upp_dmai_int_cut > 0){3 b2 a: ?( q8 b6 `$ F3 ], f5 J. r% _
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
2 m+ ^$ ]0 E/ ]8 y            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);* C5 s. V$ F  o  p% `
6 N4 M+ I; X! l) H0 ?1 \

0 w5 @) }' ^% ~0 z, F/ }) X. `            //copy data to upp_recv_list_busy2 ?2 U  _8 d: f6 o8 y, _. \
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
( ?5 Z+ ~1 k  U  A
; Z0 L, t( C8 f1 m; b            //
( V5 K+ ~- K8 j8 N8 j            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( ~4 I5 l! Q# X6 |* M' }
* @* S2 \) e, S" a/ O: k            //9 Z# o( i! G$ r) ^" d' s' M5 e
            server->upp_channel_a_recv = false;//; S+ ]: q' D2 Y

& u! Y' F( V# D            server_msg_send(server, APP_CMD_LOG, "upp recv: success");1 z7 T# H/ b* v6 {0 i, m
        }  `5 V1 {3 X3 z: J
    }
7 }6 n+ X" [* _/ D- f# W7 l3 d9 N$ k4 n
; {5 i7 t7 N7 F' s8 V  ~
    return true;0 h, I% h+ H& G* I8 M
}! x; J; x% ?0 C6 X. U! h1 d! b

" D) r$ W1 Q& O3 z7 e' F7 Cstatic bool server_upp_data_send(Server *server)
, E1 J- L' Y' Q- Z6 W4 I( f{
/ W6 G5 H7 G5 E* g( x" }) l/ U    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) Z& _5 I# X2 ^; b0 Y0 Q( l        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  J. {  A9 Y( s0 I* G% C
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, M" h. H: s5 g; |- f9 e
        char tmp[128] ={0};3 a( H- M/ T) H+ I4 D1 {* L; r" ~
: s9 F$ q3 {% l2 t4 t) D  Y$ i
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 l6 w; s9 z$ q8 T; X        print_log(server, data, 64);
. Q" z% X4 [3 @+ R- w1 W$ _: m4 I2 }# E, Z9 a" t0 m5 F
        //* ?; W3 U! @- j; b  f2 O
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; r+ t* A6 c3 S4 L% P' t        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
; u1 B: n1 Z- B' |        print_log(server, upp_buffer_b, 64);: f0 @7 X% `1 Q! u! g

. N2 p/ t+ H7 B8 ~        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);9 Y4 T: f+ b' c/ E( r; {
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! w, A  _; ^* L9 T
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;$ `: N+ C4 ~: M5 K3 ]7 ]
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% P( I- J, I' x6 V6 W1 `" I, O/ l6 U; d' i5 d0 x
        memset(tmp, 0, sizeof(tmp));! G( ]# R! ]4 q
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; a6 @) o* _% M2 h2 O- W$ N) E
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 X3 ]* {5 u; o2 L0 E
        server_msg_send(server, APP_CMD_LOG, tmp);- t  ~; A  [* ^* x0 i( W

6 R& f: q0 W/ R2 k4 L/ \9 y        upp_error_count = 0;4 ~: y; y) a/ `  B3 i7 K
        upp_dmaq_int_cut = 0;2 o1 w) l3 Z( Q3 x- v* ~
        // fill in data
& l, s& B/ z+ o7 v' Z' H        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" ]$ C: B3 q( k$ i! z% V        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. X! x$ H: s0 |( Z, [

9 D1 Q+ ^6 A  w. O  _0 _, X0 @: E        // wait send success& W; S  ?1 r, Q. K* a  t
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " r) S# C+ d' f9 Z. d& N4 s7 L3 l3 P* ~
7 g! ^& R" h; D1 X1 M- v
        // make data node in free list
) y5 q  {9 q  h* J$ S        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ |( @* w# Y! d5 m        server_msg_send(server, APP_CMD_LOG, "upp send: success");5 _  Q7 Z/ |) L# x, j4 X4 F& b  |
    }
  g9 d- P  a6 M8 c* k    return true;
: s- _+ K" k1 u, x9 X+ t}8 E* x7 |) S! C
/ S1 i" \2 p! \  f8 b$ g& b
+ \' C  v. v6 k$ k" c- {% b
) x! ^% |2 O5 B) y; j4 \3 u
( I# @: c3 p& ^" x

0 F2 x' k( I9 l# D1 w2 ?; ^

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
+ J& w$ M! l: I: m6 e, [# x) T7 h; ~3 Q1 ]% d. F( {

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-23 06:51 , Processed in 0.061915 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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