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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 5 B7 M9 D# u) P7 h4 t9 F

( @  K/ ~, f1 X6 |/ ^问题描述:
$ y( N" J  U' E5 q在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:. |3 H* Q& C& ?1 l- |0 E

) R- N4 ~- ~" \' G( d8 y图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。% ?' o3 a: {1 ~  @' p: M- ~6 x* _
' f. x5 ]* r* v1 c
测试结果如下:1 V/ h' R" p* `" }+ S, w  z2 V
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
& B9 _5 v9 h6 J! W
: ?- N$ y& \: U# E' Y. ~$ Q$ P% G+ k4 N
备注:
$ F+ X( J8 j; W" \1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?7 g  Q. `5 X; G4 W
2、相关代码如下:+ J  k8 U/ W3 @# W# e
//UPP DMA缓冲大小512字节5 X' t- @/ g$ `, f( N! O6 N* g1 K
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ a: ^; Z, x9 o1 |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 z6 x/ T' }% M/ \# x- d) s
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" k4 s0 I- {8 D
9 t1 X  E% H! V0 S$ l3 l+ ^) E2 W/ K: ~" L- S9 H9 H: F7 ?8 j
//upp接收、发送buffer
- j& n/ j) U- Y+ s1 h#pragma DATA_ALIGN(upp_buffer_a, 8); o( ^! V$ W" G
#pragma DATA_ALIGN(upp_buffer_b, 8)3 L$ _) K3 f: L9 S

$ n" O9 w4 N# h9 T7 F$ M% Y* Funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, `4 c# A6 j+ x" u# Zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];# U& p. n0 W+ R# E

0 V5 d+ M) W+ A/ ?  W6 l* E" M% E9 C$ S! A4 G
static bool server_upp_data_recv(Server *server) * o- L* R) f3 S
{
; R& q- q0 y! K. u' ~    if(server->upp_channel_a_recv == false) {  H. [# ?0 @( _
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 C1 m4 @% `+ u) l$ }" J6 A        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {  ^* K; _) T; a% [
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 R! W$ F; |. p
4 o8 `1 `2 k, S( H
  N! X1 {% R1 K/ y# }# P            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- e$ d# V4 S- `" C0 l3 z. `3 y3 m# M/ g3 p3 A2 t. a1 F
            server->upp_channel_a_recv = true;//
+ i' a7 ?& l' K2 h/ y3 k0 J* V: Q            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);" t* z2 {) ]0 w6 K
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;" y/ i1 m2 ?& z- a7 w
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;9 P$ t/ L: ]  B- ~
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
% f- P7 ]1 O- k, j. Q7 z7 w9 ?) ]1 F& g- g+ M+ O
            upp_error_count = 0;
0 |0 U' |4 r. x7 T" r            upp_dmai_int_cut = 0;
( G% K! i8 c7 z0 I9 g$ @: \: v: X! e& ^* Y5 H
            // fill in data
; F: h" r! E. E- Q3 X$ z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
- p! |2 ]: t8 I3 V( Q            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. A# K2 F; t) K: q( b
        }; u: O4 O) [& m' D: g9 B) s( q
    }
9 H, g3 h1 c( L. h4 H  S    else{5 l* n, F! D9 `
        if (upp_dmai_int_cut > 0){
8 J) N, @/ C' `* H            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" J, m( X, f" V# h& M            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# ?$ B' d: ]- f, q
3 @0 \) ~4 K' i% j( B9 h1 b, y: |( H
            //copy data to upp_recv_list_busy  N8 a5 \" o7 _' e
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 T  s3 q% o% X& ]- [9 e0 O
6 s' A3 m# j& u1 X8 M! Z9 L2 \            //
5 b# J7 h2 W. g- p            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 e5 N" Y5 W7 X! ]) T+ h; r$ E: W) n( T3 Q6 H$ k
            //
- Y; W: j9 R9 T. E            server->upp_channel_a_recv = false;//
0 V7 J, x) H6 A
2 |8 L% h; G6 e            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
  y, e3 P7 W9 l' o        }
9 x) u. V8 j  G) T+ F! J7 c    }
; Z4 Z$ b% x  T2 i& o6 b) H+ p$ E8 ?) U( t

9 s% [/ i. y" z3 q% r    return true;
% o. P. `6 o  r# N, x}
9 X0 x  \) L/ \( l/ ?
: }' A# H4 _( {5 M$ z4 l8 ?# Ustatic bool server_upp_data_send(Server *server)
( z% ]* }5 u6 C{: w; t# ]; k# v$ E# F
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){; w& [7 R' ^# u; I( n) k( x
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);- p0 ^5 h& o- [! X7 ~4 V+ s
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);! G# k7 R$ W8 l' q( Q% y( t2 k% u
        char tmp[128] ={0};, |4 m/ |) i- f( r

7 r3 l' Z9 x# \3 Y8 l        server_msg_send(server, APP_CMD_LOG, "upp send: start");
. z" O/ Z$ j" N3 e        print_log(server, data, 64);
, K' J: P" ?/ f" o3 M
. _! i$ ^# W1 F/ g! S# m) P( I5 P        //
9 d$ G) b& N' g) b2 @# p9 X2 [        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. [5 G4 B- u- P8 {! r        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);; i% V0 U* i2 X, ~" q9 c* X
        print_log(server, upp_buffer_b, 64);
! k1 [5 Y* s. w( `/ ?# z/ o
5 P; ]3 B' B  M) e3 q! C' ~0 a        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
: y! {. N: r; n8 E9 T5 N+ T" d+ |        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ! I# G* m( p% C0 F; c) @
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;/ Z! M. z0 }1 R0 @" L) ~
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 G, a" C, @0 ~% y* a3 Q
9 A2 s2 w1 c- b7 f
        memset(tmp, 0, sizeof(tmp));) Z! S  G# D1 Y4 T  H
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 E/ P! B$ c2 I( s" N+ e
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* k. M) ]% l# A/ u0 j# W- |* M
        server_msg_send(server, APP_CMD_LOG, tmp);. ^! z: \& @7 [! ~9 d! T
" g3 |/ q/ O  @2 v
        upp_error_count = 0;
4 @' L: M% W% t( }1 U6 T8 o        upp_dmaq_int_cut = 0;
! a/ }3 q9 u. G- c        // fill in data
1 o8 A; t5 J1 z+ p; i3 ?        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
" _! s* p6 `' p        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");2 o* S7 O; h4 k3 F" B: f6 N
5 y0 m/ M  `8 v( F  m- c8 d
        // wait send success7 n- w& `* g8 Z$ K. X' V( @* ~3 m0 @
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
9 F6 o3 G. p3 F' s' z. h/ {4 U/ F) W! G6 v* q. b( u
        // make data node in free list
1 Z. i/ i+ O6 d1 L        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- h9 }( m0 q% _3 T' R
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
/ T, b& E# B& M* p& T4 r# K$ \    }
8 S& V- Q6 C6 M6 |* ]    return true;6 ]" e, ^& J; r" `7 \
}2 R( V8 `' q3 h7 ^4 a
% n; L3 ^* V2 g
# u" L$ S' u& M0 V1 L& C( `
/ N2 E2 {" y3 `2 S+ E

. ?' c& a5 r! e2 i% v
2 u) n& P" z# @

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐/ Q% [0 ]+ k' X% F+ _
; X* q& X( k6 ]1 v6 j- Y

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 00:44 , Processed in 0.041488 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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