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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑   Y1 r. d3 h5 J! o, M1 Z* y) X' m6 O

& X. B( y8 ~$ p) r$ Z问题描述:0 _( E7 q. l( S# q
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" O8 s9 S- ^* B- U$ N2 `
( b* n' ~0 o1 C& _
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
, z' g$ Y- u! h. ^  @# R: ~# F) V5 q, {% Q  t1 S
测试结果如下:
  l3 a$ i& Y" q& \( [8 R4 D138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?/ q) L4 f3 S/ W+ H( v" I" ~

& B6 `0 S5 m: J9 l$ u
2 `( P7 e- `5 N5 L" D3 i3 T5 q备注:
' T9 g* N7 m# p6 Q3 e1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& J* I& c' ^" q5 Y- a
2、相关代码如下:
$ Q- s; A2 o, _0 d0 Z7 P- ?( d//UPP DMA缓冲大小512字节/ f) B4 P) ]. n& h! G+ t
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
& N. [- d! m& W; c% t. y# }#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' P" C. {& }) a/ q" C' g' C, w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& o& F) |1 K2 d0 [# [9 }% j, r4 _5 s9 G& O. M6 l, R& K
  A$ x2 U+ l, ^/ {1 P
//upp接收、发送buffer
8 B2 n. K1 R- m#pragma DATA_ALIGN(upp_buffer_a, 8)
3 t* B/ v$ k( d+ @+ v#pragma DATA_ALIGN(upp_buffer_b, 8)- z) S- w2 U9 a" k
5 l* f- j4 C0 T% M3 O
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
( u& m4 l# u/ z, w" B2 g6 h& Funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% \; \* S1 @' M% {& L4 c( b& S8 M
8 r8 ^& _6 \1 u! e" F; A# y1 s
; \) q4 @: t# m- Ostatic bool server_upp_data_recv(Server *server) 5 t, i( S! F6 N" Q# o" ], ~  p: D
{$ ]5 }% Z# C2 j/ I$ i) f
    if(server->upp_channel_a_recv == false) {
. _1 m( z8 \  s+ g0 \; c, c. J9 l2 T        server_msg_send(server, APP_CMD_LOG, "upp recv: start");$ J- |; h* Z& C- X  d  Q/ p3 X( E
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
" p" s! u% T& g# q+ D! x' {1 R, Y0 _            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; `' w  c. I( d/ ^! T7 P
( V1 G5 j/ ?( M1 x7 {5 h
  ^9 p( A% A) [) T            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* K5 B  `* K- s% ]
) S5 g& }5 D( I2 h            server->upp_channel_a_recv = true;//" J6 W, P  E+ }( }8 N* M3 }1 D
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( I0 b, P0 y, Y$ x
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
2 c7 F6 f  U0 ^4 n            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
4 U% D* P$ n( o& Y+ [            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 T1 ^. n0 z+ K5 c' L
0 z3 ]3 p0 M) {3 P6 `' {            upp_error_count = 0;5 l, T0 f) i9 p' d8 @, {
            upp_dmai_int_cut = 0;
. [5 f# S! K8 v6 J& t
; i% W5 t( s% |! u1 e            // fill in data / j" ]) n$ q+ t: N7 h( D
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) J. ~5 @( t" G3 f: ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");1 u3 O6 _, `  p) q/ u' R
        }
" N/ L- O2 F  ^& N: k4 {    }6 v( \: ^- ]0 F+ Q1 h, w$ @$ f: z
    else{
$ M/ l( S* D9 b        if (upp_dmai_int_cut > 0){" n' P: S3 {+ [
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% C  o8 Z7 X9 _, T
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);4 B8 Z3 q! J/ T3 A$ d% _$ }
( [/ m; V: V) z8 k# D' I- \4 ?7 ]

( P" A% I5 v3 y7 E            //copy data to upp_recv_list_busy
; i; K' x! S* o' B7 r. s            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" g) J) w$ O% N; j* ?0 R) q

7 l+ \& b5 T" z1 B3 o& Q            //! _/ D& Z' X6 [# P( {
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 U8 y7 I: T& t/ x
% R7 x7 ~0 H1 w. c( [            //) I4 O+ d( b; t! Y+ p* m
            server->upp_channel_a_recv = false;/// g1 w* {0 D7 U8 @  ?' C
' [# c# z( H/ [% D$ p! q! h
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. G. M; p; o+ c8 ^- s# W        }: y& U+ X: {' B6 \3 ~8 P1 t6 C
    }" s3 ^; ^2 ?2 S( `: E9 S& r
) r# p' h" b) z( j2 s, N
/ z3 k0 r& W( q6 Q% S
    return true;/ n4 {  ?5 c, z+ |: l# n7 w( W
}2 s# i, R+ i" c0 o1 I. H. `: b) R
  a6 ~5 J" P+ V( X8 X( V) y
static bool server_upp_data_send(Server *server)
  q* U" m/ I7 e: B{
' b! j3 k5 H4 z( p    if(ListMP_empty(server->upp_send_list_busy) == FALSE){2 G( N4 u9 ?, [1 Z8 R4 P" c5 p
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 _, r2 \* T$ J  [5 K
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
" |: z+ ~' }) M8 }' u        char tmp[128] ={0};
3 U3 Z' |6 N7 Z( E2 ^1 Y0 g4 |1 k: X" s  ~9 q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 L6 S8 J9 M$ D4 ]. c2 ]- w        print_log(server, data, 64);5 E8 |( v" {- h1 b3 A+ @  W

" C3 p% O' i. J, }5 J/ ^  W        //8 J2 M; e; m3 m# C2 k$ `
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) S' U" [. z+ M* x/ L+ ?
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! b& x& _/ m2 [- t6 t8 E) n. H
        print_log(server, upp_buffer_b, 64);7 o6 I. \" {% |& D; `

2 ~9 I9 b! C3 ^) @/ e& s        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
; m" I7 ]0 r* q  z        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
2 m6 X: l+ h; |& L7 C3 f        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
4 T: F5 \5 D0 k  k1 v4 H        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) o- I7 N0 J1 F# W4 `% C
8 \# a+ A0 G4 M* s: n* T9 g        memset(tmp, 0, sizeof(tmp));/ N) R- l# R* L6 t- t1 b
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" g% _  Y; c6 K$ Q            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
8 n* k9 Z: `) r5 b2 L2 v        server_msg_send(server, APP_CMD_LOG, tmp);5 b$ f0 G* }, k7 w4 r

8 H; ?! s# f! Q, w, r8 q7 U        upp_error_count = 0;
. |' m) d+ n! I5 W* I; k        upp_dmaq_int_cut = 0;$ h$ w' D' ~1 r3 M
        // fill in data 4 Z* m% c% L! t2 e9 S
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 Y, o' |9 \; ^8 [3 u$ a# x; z& w        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& N& s5 O" [1 A: \
% O7 j2 s& D* z' u) O# ], I! b8 q; ~
        // wait send success* B! A/ {- J/ {, b5 Z
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   p' _4 a" J0 D/ m+ O' |

: r$ |9 @# i# A$ L6 B5 C, ~        // make data node in free list
) F1 t0 B2 U' }. p        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);( {1 [7 P3 b% U, f2 E# z' ]8 z
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
7 w* B: D5 _0 m' M    }  h+ b, H. m* d
    return true;1 i1 q7 b1 K- u
}3 g7 y1 y4 t( D" w" ^% h$ D

2 Z& _5 p( y) @2 _5 g

( y7 a& Z8 a  _5 |* H( W5 w# ^  t% _- B; H1 T3 J  |* e: D4 q
9 X' L+ t2 x) e3 ~4 P
- g" g3 w5 F3 R4 F; t; L. f% D

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ V; Z/ x' D8 n# i
3 H7 P. d9 v$ T% V2 ^1 j1 \( O

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 09:12 , Processed in 0.044158 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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