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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 c0 ~- L4 Z. {7 h/ z2 }( E
- q/ p- M' S! o3 D问题描述:
+ D) v) t: \; d* g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 C- b  V" Z, P2 ~/ U; y

! K. p( m3 v' G/ E/ d9 K" V图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。' z+ N/ l: z  w; h# E2 o( S" c

; f# o; j! X, Q2 n1 {3 l4 p测试结果如下:
: N) B# Z" u+ x0 R" p  _4 k138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 G6 q* J9 i2 c0 H) R
( |. M1 |/ _1 d/ y4 p- k+ t3 o8 O" E! a7 {8 |
备注:7 c9 n. _) }9 g: J1 V8 f
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?9 C/ O) V5 N0 l; h( p# k# }6 |
2、相关代码如下:
9 `8 L$ _9 `  G//UPP DMA缓冲大小512字节5 X& U# B2 v0 I$ y' {
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 }9 I. A" @- s1 m8 b; L
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 |  b2 V& F, Y
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
0 l! t6 J7 K- [6 A+ n0 b
. i+ I9 u) L! m3 X
- c# a0 d; x8 Z. O//upp接收、发送buffer# [4 U1 p2 T9 u: D; D" {/ ~
#pragma DATA_ALIGN(upp_buffer_a, 8)) Q) ^: f; S  D2 o) S+ C* E
#pragma DATA_ALIGN(upp_buffer_b, 8)$ Z% J) `- |3 B/ H; T8 y
+ e9 `' R" J( j1 W# G
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" }0 c. i$ k1 z% Q* [* W8 B! K
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 _- [/ u8 S2 c- {+ i, Z1 w

9 m3 k4 K: V1 |% P7 \/ y0 W% L, B/ z
( k5 ~3 s$ M- kstatic bool server_upp_data_recv(Server *server)
/ D; D$ R+ e' |" z6 _' J{
" |1 ?; Y. L5 P1 P- z, G. s2 v    if(server->upp_channel_a_recv == false) {
1 n; D: b' L4 Z& d3 B* L; A( O        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
2 o' P, L0 z8 l; u        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ [/ B  H. P7 M            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 V9 O5 j+ I( l
* L7 }* x& H/ j: [! Z2 c) X6 |/ z1 a0 i6 G: e
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
/ }9 I+ F8 x9 @' d) p# F1 c/ J* `6 Y3 }: e. F: |' w
            server->upp_channel_a_recv = true;//
3 ~% D7 N' m; n' v% X            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);" m0 o6 f# m( {) O6 D1 o6 P  ]
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ R5 O+ X" J( w1 b' l" J            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
1 K& ]9 ^6 S2 _3 n4 |  c% R# g% h. n            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, d9 z& n5 y4 C! P. Q- a" }* F

( m$ j# [- U% Q' q. E4 K            upp_error_count = 0;) `: |2 Z) [: U$ g( R( |! M- J! N
            upp_dmai_int_cut = 0;  K8 W& P* q" i5 g% P3 I0 k

6 j- }: N# d/ `. \            // fill in data
5 c) O7 H/ Y* _/ `. V( P5 z            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# d. w1 k, n7 o. d8 s& w2 i2 K1 P4 H
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");" N0 H- ~1 r# V! j* ]/ s
        }+ ^; N1 F% L0 `& {) T. Z/ V9 Z
    }& I( o9 K0 `! x) M* C
    else{1 k4 t1 M5 C3 @( g8 o
        if (upp_dmai_int_cut > 0){
6 b0 ^2 h3 {# R            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 z# ]; o$ ?# F
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) Z; C7 g* z/ v0 F& A6 o& k- W. W7 R- U6 X" S& P7 q
( Q2 @* l! q- s
            //copy data to upp_recv_list_busy6 U+ w$ |* y9 B: G2 ]1 \
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 W& b! `9 X0 R2 k0 {3 M
' L+ U* t) D) _# T; w7 d            /// ]3 `% m& j3 @' h
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# f7 f" c0 W% r9 J9 Z+ v
& p8 G" N! Z4 O0 d5 C; g& s% m# a            //
$ \8 V- x% w/ N! a+ d            server->upp_channel_a_recv = false;//
. v$ P( d2 J) w9 k- N% h5 ~9 o) K
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
% {) o; I# i$ N# V& R: x        }" [: F1 v- U' c4 [9 `4 S
    }' n3 F( p, B5 Q( c  p0 C

) n. }& N+ C4 e$ F" S7 i
" z5 @. T+ c, k, f5 J* R7 u2 v    return true;
# U: v& |0 ]7 G9 A- i# Y* [}6 [! Z5 ^" u7 j! z/ r! K
' t; X* b- O  ]' x
static bool server_upp_data_send(Server *server)
7 n+ U0 j  }/ X( c9 I9 q- |% _9 i{
3 \, s: \3 D8 A: E    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
; _& E" A  X$ r* k& W        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);1 i  l, e, n2 V9 i* X$ H
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
$ l- ?. E1 ?" V" \  e" F( O        char tmp[128] ={0};0 I+ r! m4 H; Z, l' @8 G* T

1 y1 j; B0 A/ @: a  I        server_msg_send(server, APP_CMD_LOG, "upp send: start");
( ?0 ^5 |( q% T2 D  U        print_log(server, data, 64);& C# P; ?. E+ H/ q) }$ W
4 Z9 l# H9 K' O; \) A
        //
$ y; o$ E# R' u7 _        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 J+ E+ [6 k2 D' u) q8 n
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 U6 M2 C9 `+ Q& o& B8 W# K        print_log(server, upp_buffer_b, 64);, X/ O% @9 v9 I+ s; k0 h

6 v1 I* o; H' [        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);( V8 ~0 l+ S+ ]0 Q
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
( l" I5 V" Z; H) j        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
) x  Z2 G( q+ f$ T. C& u9 _* M        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% n# W; I& u' V& c% a
: W- }0 H0 u1 ^4 y( M" K& B        memset(tmp, 0, sizeof(tmp));
& O0 M- ^6 m/ X# v3 e/ q        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
2 s" T; ~( J8 V  L            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! c8 P% F5 q8 b1 k" I$ l7 D# c
        server_msg_send(server, APP_CMD_LOG, tmp);
0 ]6 k* l+ \( V9 q1 x8 N: }
6 ~6 w; H7 w0 b, e- C4 @2 y        upp_error_count = 0;
' g5 \, |0 \2 g: b; Y$ k        upp_dmaq_int_cut = 0;. Z4 ^9 h3 [6 d2 m4 D3 ?7 b! h" j3 k
        // fill in data
( J4 b) e+ u9 [9 w. H6 P5 ~" N        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 Q2 l, Z! k8 V/ r
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
3 P# P; R5 N' u2 F# V2 h: \6 U2 c% @2 Z- @, N
        // wait send success7 x4 `+ R9 M1 |5 T
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 E% d6 L7 W& S( D3 I& G
9 d2 v9 n- F" Q4 v9 ?" t* b! [
        // make data node in free list
9 `( S2 u- g! V8 n6 G        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 [3 h- |7 s, U4 k
        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 B) h/ t7 R% \
    }
7 T- p& P% s9 y' J    return true;
- i2 D; \' X$ Q- H1 P; F}  v0 f0 K; b7 S1 b2 E" M0 q
# ^* ~# f' _! m
, r1 f2 h+ q# i( ^1 p; D

# z1 ]2 w4 v- }  I" e
' F. v! z5 V, r  g
/ k( }" e0 Z: `; U' a. _2 ^% q9 D+ s

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐! k- P: P4 z5 L4 w4 w4 Q; c- p
  t6 ]$ Z  D2 ]1 P! ^: i/ H+ N

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-4 21:18 , Processed in 0.047146 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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