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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - u' I8 r5 J7 x( V8 p

1 H; o8 P8 U( x9 s+ a/ r8 ^! _问题描述:
2 L1 ?9 [) G  q' j在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 g/ c6 r) _( R" X' z/ r, u: s% [  C4 M2 n
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。* [. O: T8 l8 ]: c5 y
% c6 H! `" q" ?! H
测试结果如下:+ t% x, n$ v+ |
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
$ i3 a# R) `: Y( g% a
, x- T5 M7 B) p" k6 P! I: i& m4 m  Y3 Z) o* w. G
备注:3 V' c) V3 Q: i6 T* F
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?2 ^% S  o) h3 J/ Y$ {6 W4 l" {) G
2、相关代码如下:' y+ D7 B' Q+ Q" P
//UPP DMA缓冲大小512字节/ s  m8 d* y% L6 I6 e; z6 I( f
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
; E# }$ G( `, ^% j% |! J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* ]1 M, O' {/ [) d; k( `
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, a$ A6 l9 f9 W" M" u/ b1 r; G2 {# W. r3 `

$ v" W/ j, l. k, v//upp接收、发送buffer
( v: A* T9 B7 H#pragma DATA_ALIGN(upp_buffer_a, 8)2 p7 Z8 ^5 k/ V& X% ?1 @
#pragma DATA_ALIGN(upp_buffer_b, 8)
; M% q" s$ ^+ P/ z; {" D$ A% `; B8 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: y. l2 W9 H: ]) q; L& nunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
5 v6 H9 T: w$ i( G: j) r& I3 N; I& G' ]( d9 _
. W' h" @2 [; s. {/ a
static bool server_upp_data_recv(Server *server)
8 E+ h; u8 S/ J0 q{7 o/ f& y- x! K' x* @
    if(server->upp_channel_a_recv == false) {. H# k+ x1 P: T8 \( v4 N% F
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");1 M( H2 A2 W+ @( H* F& H0 Q
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! o  a& c/ h% u  S8 M            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");6 q% n; u9 X. E9 {" A
6 `* y6 J$ q5 R
1 D' Y) G/ c- V4 s- K4 j5 M2 h
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
: c. s" t# ~( J6 x* K4 s! B7 V3 N& x
" e4 L' U/ ]" k3 i# H            server->upp_channel_a_recv = true;//! p$ [* B; `& X+ ]& |+ |
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);  T, x0 x+ d0 P2 {
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
& D7 W2 h" a, A            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;7 ^+ i$ |. e! r9 `$ Y
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) k; H# {/ i! [: u1 R0 q, _
4 ]7 h$ t5 M7 ~% R' A6 ?
            upp_error_count = 0;
0 S0 O4 y. _0 A, a. C6 S2 m( t            upp_dmai_int_cut = 0;8 v/ k, F2 U+ a5 W

: k' X: C8 k  I3 }1 T( u            // fill in data
. L5 C* [9 r6 h- ^            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" ~, m1 A8 n( d, Q7 z
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");# d9 Q- X+ u# V- q& s: P: X5 R/ {6 H/ F
        }( G2 d# K* v# q/ o$ W5 P; D: \3 B8 H+ N
    }$ w* }# ~+ p+ ]3 ~" A0 W
    else{
. P; |4 H* J/ X" g        if (upp_dmai_int_cut > 0){
+ X4 }3 M# l* O6 T/ P            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; E3 O, F3 u3 y5 g5 u; \            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);. x9 ~* h6 S% U" y. I

, _8 S' W5 z2 |* t9 s# z) p5 {
5 |0 Y4 p9 F0 A5 h5 u' D( g& K            //copy data to upp_recv_list_busy1 [' T4 I- H6 f0 d3 ^4 E
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
# v" a, k% z$ Q7 P) m) k+ Z0 Z" o5 ~' \
            //
- m. f( e9 D6 @4 d1 _/ O            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; U% A( [9 U! a9 y, j+ I5 a) Q# B
0 F2 _0 g1 j  f# P) t            //
, C+ c5 i# y+ C! r6 P& l( Q            server->upp_channel_a_recv = false;//$ O5 b/ i! I6 S2 J' u. P2 r
; b+ q4 u  H1 v( F  Q/ M# m! ]# y( K" d
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
$ w$ F0 B" ~& p& ^        }1 j: h' H7 w9 E
    }7 _# e& t6 ~: ~/ ~& _7 o

0 C. h7 X8 O% t) |# B( R3 q& I' z5 }- Q: @) g5 e4 u; U
    return true;* C3 I6 ]3 t# |  v- X
}
0 ^; t3 c) b4 ^" u3 T+ I. D+ m# Z, r. V! {$ [2 L; f# m* V# [; a% g! V/ S
static bool server_upp_data_send(Server *server)
/ j* A2 f. K9 ^/ k{8 X# n, w: [& O
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- i) W4 Q  V/ g% e5 O0 a+ i        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
1 r4 @, T2 `; L. R+ J7 \        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) s4 k6 i; E: z; u. T        char tmp[128] ={0};
% |# I9 _) Y; k% x
/ G5 h" ?1 c* ^5 b% h: Q        server_msg_send(server, APP_CMD_LOG, "upp send: start");
; H/ i" y. F& Q; X        print_log(server, data, 64);# G5 T, j% G  ^
1 V; ?/ b* F8 p+ c+ W1 M8 }) \7 e
        //
1 l% A. S+ f! f* c        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( k$ {5 y: b/ W5 w4 w4 f  {! U# H
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  C8 a% O8 X  s2 k/ L7 b( ~* z
        print_log(server, upp_buffer_b, 64);. i; l7 W9 T. f3 x0 \; L
3 d% j6 K+ O& g  M2 j
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
7 _$ B3 s: }! l) }; |0 M! ?        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
4 D/ j, b3 l2 m5 f& K! J& W        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
& |' q6 }  |7 p0 o        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' V9 K& h* E9 y7 J5 u1 K% i
6 j: [% L  Z. ~1 j/ i        memset(tmp, 0, sizeof(tmp));- U5 E) w2 P3 ^6 C
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . l0 t) M: s6 ~8 ~) N4 k" _0 w
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);4 {2 Z  T9 c* R1 U5 d0 ^1 C8 e
        server_msg_send(server, APP_CMD_LOG, tmp);6 K3 d0 c3 k. b0 n8 m+ a

8 ~' c2 c" Z% g7 P        upp_error_count = 0;  Q% p, {- ^9 j0 H/ J" \( J
        upp_dmaq_int_cut = 0;& B* m+ W% v, Q
        // fill in data
! Q; [2 X2 l9 E, E9 L" v+ M        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & U3 N2 b8 H2 c/ r$ A
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ d" J8 g! `; n- I' H+ X
4 R  _& b% g$ f$ ?$ A1 ]3 _! s        // wait send success
: n5 [2 ], w' `. l0 ]        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . l3 A4 N& W, Q8 ]% ~5 K- P5 S1 U

; }: B1 o1 @8 [/ R, ^        // make data node in free list   S% Q, T& {" D2 b) O
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
; E3 d+ r1 }  T2 `% a9 ~1 T5 _5 c        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& v6 c% N  _! z5 w" p    }
/ o5 t1 u$ g, |3 P/ S    return true;
. W4 ?9 m' m- P& \& E}
  `& s* S5 T* k& V& h
. L/ a# H- _" c2 w9 _( Q
; I- z" w8 l2 b7 z( S( C8 @

( K' M! J- l0 Q1 ]1 V) J( I/ b
' m6 u4 |; K' U2 {' G( h! h
7 M6 _& W2 E6 }7 F! k

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
: r# i# f' n, x4 Y0 j
1 a1 W$ U3 n& v  P2 @. N8 r* r

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 13:25 , Processed in 0.042101 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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