138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ) v$ ?5 n: L" t) z9 ~
6 W3 i; d8 d3 F7 f  n
问题描述:
! m5 c# l) _1 U7 P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* `, U9 D5 O, ^: Y' c
0 D, `! z: P% l" F6 D6 [7 A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 x, R( Y6 v' d

: v) _8 D- ?( O7 F0 I测试结果如下:# D# u7 h+ M' a4 f: v
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 z0 j' U6 _$ l; K! y2 w6 g  k9 X  O: `' [% v, h
% O( C0 N' _1 p, l: t. I- Q7 f" B
备注:7 o1 M# n+ |, p8 t3 D
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 Q; r2 M8 D, m' v. ]
2、相关代码如下:" P4 q. a% Y' \
//UPP DMA缓冲大小512字节
  s" n! l' k1 @/ r6 K#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
2 S4 k! j# H6 c  C& Q#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! g6 L, p& H2 H1 h6 M#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 z, d7 j: A- A, J) D+ W( k1 O" U$ c. e: s
- f/ V, d  K' ~+ J
//upp接收、发送buffer
- ?8 `! ?8 l7 L. {" e#pragma DATA_ALIGN(upp_buffer_a, 8)
5 j5 j  N) ]; ]; S+ s5 T#pragma DATA_ALIGN(upp_buffer_b, 8)" K- G) `9 K: h1 I
3 |% x( c, r4 g4 \
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 R$ P5 X1 d$ `* x( C4 Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];9 t; ^2 z* L3 d/ `! N

+ a- u1 S0 Q/ }! g* ~: W) i3 D. a" u. r8 ]
static bool server_upp_data_recv(Server *server)
6 H' a- B+ ?; {3 S! z% F{
* K7 X8 Z. x: n# g    if(server->upp_channel_a_recv == false) {) c% V9 W% o  ~( h9 R) G  ?
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 b0 W7 G, J' q$ p5 F% Y7 V- u
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( U5 t/ @7 W% Z; v% s
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");. N0 s5 }) q! B7 i+ [3 T( L) s) X) z

9 O+ R' N/ D% A" _3 ?0 p+ }% B+ a# I1 y  T$ S% m5 g
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);+ L+ B$ Y, W0 B

, Z6 X! X$ P0 w            server->upp_channel_a_recv = true;//% Y: ~' g5 l; R3 Q, w5 y* d3 h
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
$ _% k  G$ [+ R+ [            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  s2 v8 g* Z% Z            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;  b$ n4 ^% t% f& I( r
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ x& ?: B/ O" _' M* V/ ^0 i5 S% a/ U" u( ]# A
            upp_error_count = 0;
5 _$ t( h) u  n# H3 r& [- [            upp_dmai_int_cut = 0;
$ \" m  S9 n4 ?6 f7 Y. D/ d; d7 d9 R( t
            // fill in data
+ ?' h# L7 V/ n( Q            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
; C. H& f% k/ ]7 a% X            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- o; Q0 M7 h9 L4 M0 K* S7 |2 b. R        }
( _: a( A$ p7 x- f    }. R: r! F2 \9 I' l6 a
    else{
) |% ^' c4 f/ w; `        if (upp_dmai_int_cut > 0){
3 A& B  _) r" d% q# V( v            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" w3 f) o' C5 \            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& H6 K7 X7 U) {& x3 K
3 f  K( I, a9 E, @. o- [
5 N% H8 k5 Z6 b9 |8 X4 M- E            //copy data to upp_recv_list_busy
% O' c7 F2 o0 b$ a            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);9 J9 ]: I" S3 @) R$ h: _
- s. `3 w! c' X2 Z; g* v2 R$ S. T
            //' C' h  L) i$ c/ A& |/ V+ ~& o
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
) P( {9 l8 R, u/ x1 n0 ~3 N3 ]) I6 M. X& L5 F8 `
            //
7 T3 C* Q3 z/ z" h+ h            server->upp_channel_a_recv = false;//
2 x) ]% M" _& x8 F. g3 K
, U$ {2 G8 S. M- T- o( i2 a' r            server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ M0 l0 D# E4 h
        }
) c0 d* _1 R% |0 I- F/ \    }8 X# E# l# C. n8 \! p( L

0 M4 F0 y3 p% h' r4 p
8 w8 G4 K, ~; h0 f3 ]% P    return true;; w% g: s% O3 M6 J1 T5 i8 q
}- S) h- K6 u/ h5 t5 \

/ L' ], y: N4 }1 e% zstatic bool server_upp_data_send(Server *server)
# d5 q# K6 |6 J7 O; H$ C% H3 a{' D3 R, [) }$ Y6 P) _. m9 s
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 D( a! [. N. c& r) S% w        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# q. j1 A/ T+ p# n- ]
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);7 W( M8 v" E  r
        char tmp[128] ={0};
$ V# v( ~) v! _7 N4 r
* a6 E& e( A7 S( ]0 `3 l% e        server_msg_send(server, APP_CMD_LOG, "upp send: start");% V% r; L' v4 ]0 |" d5 H
        print_log(server, data, 64);$ o7 ]" |. {$ f: o/ R

" k" @- X. q; Q        //
$ r) w5 o/ f( r        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* I# f+ ?2 c+ ?- _& q8 `- ]        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ R+ y6 e2 v, `        print_log(server, upp_buffer_b, 64);  @' O* S5 _  d7 R! l

* }% Z# w9 f/ t" G/ [        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 a# @$ a' `$ ?( g  \1 Q        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 A$ y# G. F9 @, b; @  K7 y        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! T+ g( ~/ N: x; ~
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 W% Z, l1 D+ c- ^3 {% u! L+ f6 C2 j0 Q
        memset(tmp, 0, sizeof(tmp));) G# b# a8 `6 f' y
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " ?+ H4 a5 _  {, {
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);' [1 j* ]! \4 j" j
        server_msg_send(server, APP_CMD_LOG, tmp);9 y0 F+ l  j0 ]* w6 K9 ]
4 t  z) K, R" L
        upp_error_count = 0;
5 ]- x5 N. e2 H% t6 A        upp_dmaq_int_cut = 0;
: u$ e: V* G# Z1 g3 q        // fill in data % P% E' _8 W3 h
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ' z" U9 r, D3 J/ l" u
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 K6 t! U- H- ~1 o& h9 u1 i; H- x) H) V
        // wait send success! K" t* {. o& l
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
( v  j3 `- t, \* w" ]8 o* T6 L6 d' ^" _8 L+ B4 r
        // make data node in free list ! a- l% v& W! K+ h
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
8 u0 x/ s# ~5 G) _+ s0 u( e        server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 ~5 s5 ?, h, N0 K    }
& P; f. ~0 ?( e    return true;; L2 d2 M. ^$ }! k: v) M
}- O: \; u3 o, P7 x! H1 p
; A) Q5 i6 A. v, V5 m* x/ M2 M, t, k

  h# w: J  e/ {: E8 T1 v4 `  ^5 |
& _* u; t& {) H/ o0 o& a1 b

6 {; A9 x7 p: O" w
9 j7 Z) r7 a+ t  R0 a

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
! `5 C: ^6 n6 A4 F* Y1 a5 F) W7 @
$ h1 d: w% t+ t* w* J7 V2 o

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 15:53 , Processed in 0.044735 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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