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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- k$ Z7 s  ~: I% @( M
2 L6 X  m1 n' n$ V" i6 _$ l7 H+ C问题描述:/ \4 O7 z9 p/ y( `$ s9 Q9 d
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
! ]1 m# k# U# }  F5 x, j9 [7 }1 f  W1 P8 K9 m+ J
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# r0 K. ~6 ~3 S+ W- |8 }( |
. Y. Q, b% k/ ]0 |: D/ M测试结果如下:
3 @! r0 Y* T' C" V4 ]138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
. ^, a- t1 |) z  U& Y9 @* V4 Y' D% l$ K0 O6 l8 s6 R

& l3 o) C6 W- R备注:
  i" h  ~% [/ l1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' c4 `, m$ z, q- x! T, k( b
2、相关代码如下:
9 @8 [  W7 S+ b# s& a//UPP DMA缓冲大小512字节/ W/ t  J9 I& Y; D  Z% T9 p  G, ^& u
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ B7 N$ |7 v* [9 O" \! V0 u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
1 A% {$ F! C% ~, W- ~8 b4 v2 D#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 U# w& N& B8 a; q. R2 q0 s8 T$ e" ~
; Q5 B1 s  k; J4 R' Z

0 Y& D" Y9 w# S9 c8 n5 {//upp接收、发送buffer& f& E5 Q% {- ^8 R7 K4 _+ D5 P3 _, w
#pragma DATA_ALIGN(upp_buffer_a, 8)+ }5 b0 {# m5 c/ p$ Q
#pragma DATA_ALIGN(upp_buffer_b, 8)8 ^. K7 }" w0 C$ \3 ]% g' Z
: w- }. }/ q/ b7 l
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];* K* a# b2 H6 w0 J
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
$ s1 a7 D* j# N( w# |  C2 s; ]# Z! Q$ D& |9 r! {: k, v6 @# G7 d) d3 v' J
+ E- e) S2 R/ L, I$ w
static bool server_upp_data_recv(Server *server) " X. s0 Z7 n5 Y$ p: \0 f9 U
{
9 k% E. W! y2 F3 x( l9 t; d    if(server->upp_channel_a_recv == false) {
" r, A0 ]' k3 l        server_msg_send(server, APP_CMD_LOG, "upp recv: start");8 b( @' c. ]) T
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 L& _! K* Y0 ?9 o- P
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 z1 `4 P8 f) O, X2 B. C' q3 ~9 m4 T8 i+ j9 C: W

+ a" \" n6 Q, W; `4 `% w            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
5 ~5 @6 Y; h# u0 ~4 x
/ m# R  d; B- q8 k5 T# I$ a  M/ m            server->upp_channel_a_recv = true;//( N& u# N$ w& c% T- {
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);$ T+ |" i1 ^  y- L' Z
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
2 {6 c: Q7 p6 W            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;$ R" K) k0 n1 [
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 _# I/ e. a/ [$ n) T% q. D7 S- U7 n; ?" x2 }
            upp_error_count = 0;$ G8 b6 `8 Q" A
            upp_dmai_int_cut = 0;2 B& B, E$ K2 j0 o& w8 s; `

1 S, w" S+ n& \            // fill in data - d" h( K, N8 G, ^$ L( l
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 \& @+ k2 k; m/ I
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# d; b4 J6 e; s- ?/ z7 W- \        }0 ?% V2 {2 X" B, s
    }
3 ?  ?$ W/ d. ~# X" n  _    else{
/ K8 V# k& w3 b3 v# V8 E& r        if (upp_dmai_int_cut > 0){
3 w8 Y+ ^  t" U% W9 x7 o+ k            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! W$ D( s& {# Z8 K            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);  L7 V0 o- E( Z- F) F0 K6 o
8 ?  J2 y, D% A# S
) \+ r; N5 [; D
            //copy data to upp_recv_list_busy
+ f4 J- x! s- _            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);+ i  p0 c. X0 `

7 Q" A- V( B- b7 K/ k/ G            //" s# ?& S4 x+ a
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; w1 }% b7 W  E* X0 W
2 ?% l3 p) t0 ~/ B4 W0 v% ^            //
( G$ V7 t- V) S  j2 C            server->upp_channel_a_recv = false;//
3 J$ d" Q8 |' ~! Q- N6 O- {) Z( |% o9 d. V% [2 l+ k# D
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
# C  ^9 T) Q3 B& c        }
3 X+ @& g- e  t) V2 F    }+ m9 s" _* L" |4 |
, p5 G5 v9 D6 Y' P: h9 W5 j' h
! i0 \) B0 a+ D% U; U
    return true;
6 c) g7 d: C6 {, a}8 t" h" S3 g# a/ o* f  W0 a/ @. g
( r3 }. X! |) V4 _+ l3 u9 ?$ E& f
static bool server_upp_data_send(Server *server)/ H5 |9 g# [8 M2 I0 }! R- ~
{; a/ I4 k& J, {) x2 j
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
5 n% Q/ q( ]$ j/ s/ I        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
4 {7 l0 a9 s( Y3 v. e1 L: N  c1 a        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);2 `, C0 G2 Y' J" U1 Y  J5 q
        char tmp[128] ={0};$ f5 e) a5 t; F3 k3 H

# y. e" K' F) @  R+ v. m  x1 |) S        server_msg_send(server, APP_CMD_LOG, "upp send: start");" T+ q4 K0 S- f1 p' ?
        print_log(server, data, 64);& P( A) F; L  d. q4 t

9 |" d7 d& Q4 L9 ]        //
9 K# p. U) z/ u+ ]8 n6 i. ^        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);: C- q2 b9 c6 }. W# Z$ _9 z; N) E- k
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
: N7 F. p- M! ^0 @$ O1 ^* o+ a        print_log(server, upp_buffer_b, 64);
1 \$ y+ F4 B/ Y' z1 ]1 x7 ?
4 V; u/ \& {1 y! b        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);: d2 D- i" ]1 |/ D- c
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
2 Y8 ]0 j' X* Z8 V        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;: X( r3 R" K7 p' Q9 |
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;* R( j. V8 Q7 M7 z# L

1 P7 Y5 i; O. D  @8 Y- t7 y  ~# L$ p        memset(tmp, 0, sizeof(tmp));
- ^+ ^1 w, O5 v* n$ L- d        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
9 e( J8 h$ G5 u) E            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);6 \* h: g: c9 a
        server_msg_send(server, APP_CMD_LOG, tmp);
( D0 W" t5 j% B- Q# m
4 B7 ^0 A' G& |, y        upp_error_count = 0;" X9 Z  s* q) l1 Q* z8 i
        upp_dmaq_int_cut = 0;0 k2 E& |' ]8 g
        // fill in data 2 N2 W% g7 [3 q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / ^; L% v# |+ C5 Y
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ W' I" U$ H* m! ?0 r

3 f( X' d1 F2 G  C        // wait send success6 c6 V9 J2 l7 f! K; Z. W% ?
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
/ i& G2 u; T; q1 Y  W
1 K8 X: f& r6 R( ?. R; @& `        // make data node in free list 9 G+ J  c0 R; D$ ~, M& e6 d* H
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. e, V) s* W2 B% g- n
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
, R* ]0 x3 l% C    }- N( c% G' B+ D1 |% m; e; V4 q
    return true;9 e9 d# c1 q4 ~3 |3 N* Z
}& Z0 l+ F/ u& V) h- {1 [! N' H/ N/ L

$ U$ G) J6 W1 H( o, b* l
8 W# u1 U4 w4 t0 Q8 c
3 Z0 Y7 I, A: @

$ _, s, v6 {4 k+ T% s2 C
3 C6 a* e3 U& Z3 e& v

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐& a( C: E2 u- z  Q1 g9 A

1 x# W) F! U0 z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 15:08 , Processed in 0.046024 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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