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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
3 d2 `1 H% \* f0 G' A8 ~/ Y8 L
& r. g1 y5 }, J% p) O7 ?% i问题描述:
' J7 ^$ u4 v- z) ]在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
- k# E. \! f6 N. V# R, ~9 @
) Q+ F# @) Y) N* x: P图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 R% Z  F+ Q" P4 t! {) m7 O0 z/ q# b
测试结果如下:( V6 h6 r0 f# Q8 w+ A# ~. ?/ s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( P/ [; c8 {( C/ F& x  |0 `
! f% g$ v$ ]& I1 v  h
& Y6 ~2 n* c! M备注:
9 h+ A0 X* O+ B# M! L# \' D1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) ?- J3 I% E0 h
2、相关代码如下:! x8 y7 O4 N" s* J2 o8 A8 G
//UPP DMA缓冲大小512字节
2 ?' Z6 U6 B+ Y* J#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
& c' s0 K5 b" \, U#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT  d" ]# w$ }2 g! S5 z$ Z: ~: Y4 w
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)! e, d8 q' n& H+ Y0 J1 C

1 g# C1 T/ C8 U/ P$ y& X7 _- [6 j: t9 }% z1 t- h; }  H2 E
//upp接收、发送buffer
& P! x, V: q" }2 k#pragma DATA_ALIGN(upp_buffer_a, 8)
+ [: }; P! e* a- j+ L9 z#pragma DATA_ALIGN(upp_buffer_b, 8)
% r2 V' ]7 K5 c8 D+ A3 f2 ~, u- k6 r; f9 H3 p" k4 J  D3 Z- U
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
1 N, j. C1 A4 g, A: v2 W. I( L6 Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% u# D$ V: t) @8 J( z
9 k7 a4 O! F% w8 M* ~& @# v# J" H0 B
static bool server_upp_data_recv(Server *server)
/ Z" Y6 N( @: K4 a0 W{% L# w. A% S# w
    if(server->upp_channel_a_recv == false) {
# K! n' h; M# Y! O        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: L, {7 r+ K) t4 m! R7 S3 X
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {$ U' V- r2 d0 d" P1 C/ s
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- d0 [9 T" `  c

$ b) _$ ]1 O7 A' J5 @* q6 i5 N/ T' Q& r  a  n  g
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: S/ c2 w: B& c  G7 [; H4 D

/ d7 Y- B0 R7 {2 @( p            server->upp_channel_a_recv = true;//1 r- W4 C! y( [
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
, o. c, Q2 @& [* L2 f6 O& k$ G, p! D            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
7 k* A. G& l5 G) e5 }, |) ?5 I4 O            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 Q, n# V. F  s3 T: b  J/ A
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//) b2 e- l4 C- W' s! s- o

) J. t0 \+ M! y* D2 {            upp_error_count = 0;' \6 [6 Z4 {( e+ D/ h& H
            upp_dmai_int_cut = 0;
: Y/ Q) e% E* q; ]) {! x, U+ @# M. y
            // fill in data
  O3 k; W. w: p4 g# s            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 Z+ H6 [; }: w            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");4 k2 c7 h, }5 K/ r
        }
% B; E5 }% o& i; B    }" |: p8 x- {( J) d
    else{
' V) q; Q8 [: L! q6 q# [& ~5 j        if (upp_dmai_int_cut > 0){
0 y6 u; P. x7 y5 ]6 t# L: b            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);' c. w) g( E2 ^, u7 r' f" m, s0 G
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
  g6 I9 H, f; Y' p/ {' G6 `
! q# u; m7 \; |9 ^9 i* u
1 G2 ]9 {- T( Y  W9 G) y            //copy data to upp_recv_list_busy
. L' e( ^/ M8 u; g, l2 W& Z/ R/ W            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& i) M( l0 K5 o1 V
9 M3 f0 R2 N6 b            //5 {7 l; W: j% R& r, G0 S. k
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% o6 w! ^: N; W
0 z4 Q1 T4 N/ w# c! J' V            //
! B8 R) h- R7 g3 P$ J* J# O            server->upp_channel_a_recv = false;/// A6 X. |* J, k! P
8 |  `  z- t5 h( {, d
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");, m' e# ^3 V# q$ f9 C# \. w" v3 b
        }
2 R& O" Q+ R! b& }    }! k9 }' O9 o0 m
) I6 e+ e3 N3 \- U2 G- k" ~- s& O! O
6 V. y- x7 Z9 A5 p" E
    return true;& j1 }. m, Q3 a. G2 b  g# x- m
}: |. \  V, ~; w; X' V' O4 s

( o/ e6 w# t/ @4 tstatic bool server_upp_data_send(Server *server)7 g4 c* Q2 x& V% E$ I
{. C  z  E3 O5 a9 b$ \) P
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
& [0 i$ r- S% b: _. z        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 u% R9 d! I0 [0 S) H        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% v7 n' u# z8 w        char tmp[128] ={0};# E0 t. |  e2 g5 |# }% o' v0 o" z
1 P. Y0 k% b! j# I" e
        server_msg_send(server, APP_CMD_LOG, "upp send: start");1 V  O7 T0 ^5 t
        print_log(server, data, 64);& R# R9 L' q/ ^5 ]# V
; X5 k9 N0 t+ J
        //
" O4 N. j# P3 o6 n  R        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 s! V5 Z" t" J; v5 W' J9 P. n3 E        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);  @: m0 h. o/ z  ^
        print_log(server, upp_buffer_b, 64);
8 |& l) ?8 ]& W6 k0 O" X# v0 V$ {' q3 j
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
5 n% ~& _2 F4 ]  q5 I8 T        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
$ z+ y% |# F: \5 B        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- ]* C3 z8 V1 s% H0 y+ @
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ k! `) `3 N9 W0 R# o4 v0 r
2 k+ M% K. y7 I3 i$ C        memset(tmp, 0, sizeof(tmp));' m9 H  ^, V& G, ?5 w$ v. v* V
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
, h6 Z9 z( u# _& @            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);7 L( F% }) |3 w2 y
        server_msg_send(server, APP_CMD_LOG, tmp);; @+ R1 H$ i1 }1 Q3 L7 a
9 B$ [' x- J5 R$ y9 V% o& G
        upp_error_count = 0;5 s( ~9 c; V6 l: @
        upp_dmaq_int_cut = 0;+ s; m: L+ r4 v* M
        // fill in data ' }" g! \: Q$ u2 P6 {- ]3 D/ a
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & {  w' D$ g% i* Z& P* }
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
( ^8 S0 h+ A- x2 h8 u- G- `: Q/ f+ e2 c4 Q* Y1 x
        // wait send success/ |( m" D5 f8 G+ N& X0 z
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); + a8 }$ g  I: i6 o  G7 x

0 I0 ^$ H& I: [/ |- e. c. W- g        // make data node in free list 7 o& i! q* d" g# A9 Z) g
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);* m2 r' d2 r" h* V) B
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
* J' }& g( O: H2 x8 O. H" F9 a9 E    }" G# y1 W7 G3 N2 t5 Y, z4 D
    return true;
; I3 ^/ @) w, y}
. B9 j1 l; G( @' `. L, v# M+ T0 o; T1 K8 d: X7 ^
9 [. H4 G, P1 X; k$ a! e

) Z7 M3 m' f5 e. A3 u

/ N$ O+ I, ^  C+ @4 R" w5 V/ j$ l! a' o% X

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
& z' c, T9 g9 C* O- I; u9 f7 s. o. @7 b" _1 p' o

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 04:52 , Processed in 0.039481 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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