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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 j- ]# X  T4 ~- F6 B
1 f, p5 g! ^# v% A" F
问题描述:% ]( v6 c7 r) J5 h" B- G8 Q0 _* @
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 }$ y6 e# G6 A1 A3 C7 F* u$ \
3 T/ q  y0 ~: Y- q2 O2 L图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 u+ _: E6 \* ^9 ]8 a
8 l7 j& q3 z0 u2 E; ]测试结果如下:
! i: E+ `# `8 t138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& q* \/ o7 Q" p# i+ H  o$ T2 f5 t
6 C/ \4 G6 D! I- B

" H5 P; r# k5 Q0 ~, W/ D备注:
; p8 b! u" j9 ?) \8 }2 S' N1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?- w! d! i: j8 E6 G9 U8 x5 p
2、相关代码如下:3 t; F+ p6 `5 e4 V" J% l
//UPP DMA缓冲大小512字节
" f& O, N; A: [1 ]; D. e#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, K5 \. ~! q* Y1 z% S
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 B/ H( F% M3 O! E#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
0 J" G2 j- C6 y7 C& I( H- H4 y9 {6 [1 B: ^
& ?) q& r6 Z/ E; t) E
//upp接收、发送buffer
  s0 Y" ]1 `" P# Y6 l7 y, x" q6 C#pragma DATA_ALIGN(upp_buffer_a, 8)
" u  {& H5 p# _#pragma DATA_ALIGN(upp_buffer_b, 8)) O2 `9 X+ ?+ a0 V5 y9 j% U- `  V) h
+ `7 ]+ B# R3 A- \
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
% D. }$ y  U) ~% Q9 O, Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];- d- m% C  y. j3 B! f

, s- [4 b" K0 o: ]
. j) g* G3 Y9 cstatic bool server_upp_data_recv(Server *server)
: Y- Y8 y/ d* k) \* H{
/ @$ k6 L, X! K0 m8 y% j* |    if(server->upp_channel_a_recv == false) {9 I* Z+ C- H' z3 S
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: S2 \. _" U2 e% _( U6 {- }
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- [0 ?! ~7 ~* m+ L
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");' [; D" g9 y( a/ g
' M  p/ D  f% F' g; O1 ]9 g

/ L+ W' u+ v, M, @# \+ r            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);; ]  @5 r  J0 w

/ }2 E; B4 @9 r4 n( {            server->upp_channel_a_recv = true;//
: b, c4 w9 K, ?$ S0 w# K            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);9 l9 q: b. k; h5 Z% r
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;. F9 J- C3 }9 G3 ^3 N; Y
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
( a  M1 N7 ?/ t4 `$ l& T! R            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: r; c2 P! J  z  ~- y$ b- r9 ~, n) ^6 r1 u
            upp_error_count = 0;( e- l; o+ t' W( E
            upp_dmai_int_cut = 0;
; c+ [. o* _6 W  [2 x( ^, p
+ }: v/ `0 Y( |% [            // fill in data * G$ p% D- ]& a' f: U
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ b0 a# L1 p* h+ T) O1 D( K
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
4 c+ ^/ }+ W- p! {% E        }- q9 }8 O! l; N; r
    }! A! G+ E# \) d, }+ h
    else{. E9 F# R$ }+ t
        if (upp_dmai_int_cut > 0){
: b, A) H3 a, h0 r- m# ~3 n! ?* a3 f            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
1 T& g. C% D- e            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' g( M; U3 m8 N3 m

2 U8 H! z% w6 q! X4 Q8 l! Y% b. ?# W% d6 z* w& b& Q
            //copy data to upp_recv_list_busy
1 x3 ^, |+ M4 J" V2 |, B            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! V9 D, k# Y% V$ E/ m3 A$ p$ M' P# e% v! d: R# c0 G
            //4 B* _3 `& g) Q9 H. q
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);8 \3 C3 k( ^6 m5 U  b: ~
/ y) y! v; E- v# x: v! n( Z
            //5 x8 ~# ~$ U6 m$ m, C6 E
            server->upp_channel_a_recv = false;//
. d, d# j* t2 {" E) ?, b  _$ b: X
# j- z  t4 `' E' S- X            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* c, W4 b2 x$ U  h: }$ m        }
# J; r, G; a9 u1 ]8 {    }* }9 \* D4 c: Z/ \
* z0 g! D. N5 s& w( Y
4 y9 O. L5 T; j- W# G1 z1 g
    return true;' a* g! U9 E4 t5 I
}
- E/ P* ]5 _. I2 ~6 _: _3 [; ~7 g  H9 I) I2 P
static bool server_upp_data_send(Server *server)
% e# R% |7 W0 ?! e% Q, z{
. V+ x* R+ P. k  s# E# f" B    if(ListMP_empty(server->upp_send_list_busy) == FALSE){! a0 W( i# |9 g% G  \4 @) O
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& B3 J/ ?: p7 Y  }        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
  c, A  f2 Y  Y. X; ?        char tmp[128] ={0};
5 J6 i' \- l3 v, _; g# y  I# Z  n7 W. \1 U
        server_msg_send(server, APP_CMD_LOG, "upp send: start");, |; L" H3 `% p0 |* X6 Q4 @
        print_log(server, data, 64);
( ~8 K" U  b$ g. e+ T7 i- Y# a: L, I% `: y' n: Z, _
        //
# ]6 r& y# Q0 X$ `+ L& X        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; f5 U/ R3 [& w7 M/ _* ]        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 B" I$ }, A; x/ H+ R8 f1 \+ a- m6 p        print_log(server, upp_buffer_b, 64);
& I% r$ |" X. T# p; }: m2 g
7 [- L, E* A9 B        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
( w! q) L& _5 |) E* P        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
/ m8 m5 N3 v% l) S2 b, j; r        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
( a# t- I' [$ V/ h: W. A$ ]# H: G        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 Q6 f& g. N2 L/ k  P

- n0 [( `: l2 N% a, P        memset(tmp, 0, sizeof(tmp));
- \+ H% X* v  p& D9 f        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & `- |9 _% W7 v$ e! e6 l
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
% t$ U2 o3 Z3 j, ^0 i( a. C* @        server_msg_send(server, APP_CMD_LOG, tmp);
. z8 W$ k; m, ]2 k: U" M2 M( {: Q+ Z0 [9 V$ ^
        upp_error_count = 0;
! R1 z/ P7 Y# r0 O/ y9 `% q$ x/ U        upp_dmaq_int_cut = 0;- d% L8 q% f, g2 i% a1 n! T! a& ]) j: ?
        // fill in data ) P$ [0 y( q! w: ^, t/ l
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); & p6 O7 T4 O0 _# F& U2 j
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
" `* O4 m+ l* B0 p7 |
1 p! I% b5 u1 b+ c& A- N1 V        // wait send success
& P7 W& u5 E3 \  S2 n# B3 R        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ! ^0 D+ y0 w+ i9 h6 ~( X
# D4 m: ]5 A) l% u3 |- J
        // make data node in free list
3 J$ m/ U5 M: N  O# N  J% J- y        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);+ {4 G. s4 q: g) G" k
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& M5 g' z6 D& C+ S1 s& N3 \! @    }& J: ^' K0 K$ O0 i- B4 f6 w
    return true;/ {% Z# \- `0 W
}
3 {5 K# a% {; b& R" A, `2 f$ \0 P9 n3 ?$ F3 o

5 ^1 ?$ H0 J  C" i' _, Y/ O! r9 J6 F1 R" r) k
: j) i$ V& g6 }4 z2 N! ?, \

! \- f, R! H! n/ f2 k! i0 }

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: ]. _' P: k4 ~' c0 H, _0 R+ f  ?: [
% Z% m$ d, w  M& M' q

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 17:29 , Processed in 0.065113 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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