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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 ~! \$ P, T- L) E

" P$ X. w; r  K1 M4 Y问题描述:
+ o8 l: O  q" ]- B在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ {. j9 ~0 I. [" f/ i0 L. U

5 e4 B+ c+ Q6 V; Z9 [图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 y* M( z. y/ n3 R4 k6 s

, x$ m- W5 R* A% D测试结果如下:; d; d- s# m  ^$ ^# R6 ~% y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?' h' c( |4 V4 g" i4 V
" ]8 O! S; p, G# f8 z2 W
! h. P9 A' M7 ^% a" @
备注:
+ N! F: \3 W, l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# g- j0 N* C& `1 Z3 a, d0 T( ?, r; ?
2、相关代码如下:
' ]: }# L: `" U2 h//UPP DMA缓冲大小512字节' C% e7 R# t0 `6 {8 n7 N
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: w( W% [: J7 V#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 g7 R2 V9 _; u#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
, f& ^. m- i2 {% d; G
# S. U: }6 e' q0 g5 |8 q/ ]& `
- T. u( O9 H) n, x3 {//upp接收、发送buffer* G0 k5 j* L: K. n& r* n1 y
#pragma DATA_ALIGN(upp_buffer_a, 8)
% P5 e2 I: a/ c7 s; T; N9 Z#pragma DATA_ALIGN(upp_buffer_b, 8)
# }% ^! ^: \6 r0 @- S7 n
3 M' |; M$ J( a7 Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];$ t, z. x6 G; f0 X/ ]
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 Q% v  V- A, M) v9 j0 L
, H+ N' c+ @. s1 C2 H$ g7 s& M! L. D3 K! V$ @
static bool server_upp_data_recv(Server *server) : O. e0 p* ~9 D( s
{/ O: v' g5 X: |0 }6 ^
    if(server->upp_channel_a_recv == false) {& n1 n. V' I- p) }# l% V, o
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) h* M  G: ~5 R" O  k6 I/ r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* c6 `7 H, B/ X
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 P7 W% i7 E1 d1 f7 n* v4 O1 T$ D9 k# f. E

. ?8 z/ c' ?, \8 J            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);0 a9 W* N. n% U$ C7 \' _- E# E
+ e" j# j: y8 c2 o" z, T* D
            server->upp_channel_a_recv = true;//" f8 i% q* }- V  B, r- Q; }( h
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
% }, [( Y$ A  ]1 p* [/ v            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 T7 F! I% E5 E6 r1 `) ]( j
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
, T8 V$ r* w: i            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//" V8 n6 o  ?8 R$ l5 h- _
! a" P  }$ ]: O8 |1 E; m; P
            upp_error_count = 0;1 I) O2 n% `6 x1 X; S! b
            upp_dmai_int_cut = 0;4 X: g# r0 W' I2 r" D( A0 T

! D# L6 S: E. Q2 v' P: _, E            // fill in data
7 i* m! T5 I3 V% s: H5 b            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);: [8 a: @8 H3 I7 k
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 W3 x, ~  P( {+ U9 a        }
6 r$ m/ D4 ^& ?# A8 E! y    }
/ z0 p) [4 b3 [    else{
* x  a- N, n* r- R$ ~, b        if (upp_dmai_int_cut > 0){
  E4 K- u+ Q9 h: e: v            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) k4 f' D5 T/ [/ B1 Q  D            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);8 z/ i: q# x: j1 t

: E' m3 R9 B8 W2 ~) o/ S2 M. J% n  L; Y2 M9 p7 Z
            //copy data to upp_recv_list_busy
: w( I- M0 j0 d* n. L( y            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);; c$ f% e5 s# }
6 }1 {; u8 ?9 D7 K7 r
            //5 w: c2 O; {) \! N) o6 E$ k
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
( N7 I4 k/ h1 m% @! x) @4 l5 r2 m1 N7 A' K8 s- F* r
            //( p' Y" S4 r% U: W
            server->upp_channel_a_recv = false;//' f! W' h4 V: j% o$ [

2 e: H( p- W: \            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
+ y6 N7 [( A  f/ H) l- N/ N        }
5 }& W2 o$ J6 x  Q1 p8 q    }9 u$ }; v9 f, [4 L. k4 y* @
6 [4 _8 u- R' d5 R! {7 [' M

* M# T+ C% M+ Q1 ?& S4 C* B    return true;5 U$ E; x* m1 Y' O0 X' ?
}
; ^4 \0 a) ^2 O6 k
4 N8 M+ D( Q' G* H& V; Kstatic bool server_upp_data_send(Server *server)( i5 i0 N3 \2 x( g2 y: R
{
7 q! i3 R: @& N" ?    if(ListMP_empty(server->upp_send_list_busy) == FALSE){, e4 p& C5 M8 p0 W9 m/ @( V: r
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 o( g+ g; h8 s1 I- m
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);( ?) M8 w" ?9 j. e
        char tmp[128] ={0};
3 p% a/ l/ j2 ?& s
& f# C  Y4 z- X* A7 z+ O        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 N4 k2 |. C# ?, [, k" L8 y
        print_log(server, data, 64);
- X+ ^6 F' ^1 z5 O3 \/ v3 F  Q  V) d: R/ \; E( y- n
        //
" F* e7 y; V; P3 j. V- H4 f  m        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
* Z2 y' O% A6 U: S6 s" R        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 R+ ~& B& d+ O! M* O8 d9 U: c
        print_log(server, upp_buffer_b, 64);; b) v8 |' e8 z$ g. L3 R
4 {* J9 G+ K$ C2 p2 K* I3 Y
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
7 m2 D6 u0 S4 q6 b0 o% I' P8 \        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
9 E; A3 U, F/ G        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
' V, @, V; M6 S% k        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;3 v$ c7 Q2 |# A. Z3 `* {0 R' P3 z
! A& [3 x  \5 ]% X, E
        memset(tmp, 0, sizeof(tmp));
. s6 h- A. V2 v0 M1 n* ^9 ^8 T: r        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + F* m3 M9 B" F% Q
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);3 b( z5 A' }( `8 R3 _4 T' D
        server_msg_send(server, APP_CMD_LOG, tmp);; Q4 p+ g* `& w) k" {# S$ Z9 i

% U- I: V9 c3 F6 _+ Z  X        upp_error_count = 0;& g5 d* x& N1 Y, t& t1 `2 E; }8 e
        upp_dmaq_int_cut = 0;& T3 P2 Z! Y* V3 }
        // fill in data & u- `6 G) K6 C1 K. g( Q' D3 N
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 0 l5 f: G, W( `& S0 s. H0 L- n
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& V) |  b; z/ T2 D: f
! ~8 w# v% D0 N5 V3 N
        // wait send success7 [1 a( n, |: ]
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* \4 M$ i, N6 H5 `7 s
: }3 X8 i: @& R: J  F* D        // make data node in free list
9 ]) k9 D# b" N1 ^( ~! L4 ]# G        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 k. N8 ^+ @0 `3 e
        server_msg_send(server, APP_CMD_LOG, "upp send: success");: c8 I7 X" S& b6 x2 E
    }4 J/ |- Y/ U2 @  b3 o! ^1 ^$ q
    return true;- ^+ `, I8 I  c! X7 i$ {! _$ ?8 s! k7 L
}, B2 I0 u2 L0 y4 u. T" a6 j
# M9 P3 M' p/ C4 v
$ f- g# F: R+ h, L2 X

: A4 R& X. O. s9 M# j; h
; y  n7 `' y! \; a
0 X/ J1 K- n- M% f5 q8 [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
7 w: z# r* S3 I  w
2 t7 n2 a# b% m& Z* E$ M% {

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 01:27 , Processed in 0.042262 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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