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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " v" r8 }% _/ m5 B( `9 B

4 F0 Y* F" |/ m8 R& {" ?, p! Z问题描述:
  V1 |; l0 H1 [; ?. Z在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" @( f3 Q3 f9 e+ [9 b$ k+ E

4 o1 [/ {" ^4 M6 e9 h0 W8 Y& W图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
& }4 C& q5 M$ t+ R' |! S$ U* o" ~
测试结果如下:
& I  C/ w# \+ p' T( E138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
8 K4 m/ i& ^+ h# L
& J+ ?  h% {2 l+ h$ ^2 p" x4 G3 p0 i* d* N6 p
备注:
& f( y* M% b& @$ N1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 T! n0 l/ l7 I5 y
2、相关代码如下:
$ F8 K  D$ ]! r3 o7 m5 v0 ?$ L//UPP DMA缓冲大小512字节/ X/ C, y! j/ t
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- n: k" I  E# a: Q3 \" i3 z#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT2 @. K  v0 I% e6 M$ w
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( u+ O; S1 K% _: U1 y, p
, @# X8 d. M  ~' R# b) j6 T: c. _1 Z* [9 l1 f7 b, m/ W* l* Y. k
//upp接收、发送buffer  L7 }# ?* F6 T& o1 a
#pragma DATA_ALIGN(upp_buffer_a, 8)
) J  P  D9 S' G5 I/ O5 d5 O#pragma DATA_ALIGN(upp_buffer_b, 8)
, i& W/ d* y& m/ i* z7 Q  k3 z. c
5 P- a/ c  ]* q9 }! q5 `unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' Z" k$ s7 y$ Y8 C, Dunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];8 m0 |( X" \* t, V( b

% z$ L! g# `; o7 t% Z
. F0 {9 m, z# jstatic bool server_upp_data_recv(Server *server) ' j) C3 |6 D6 }6 B. a
{9 ?* W5 ?0 Y, Z/ t# s
    if(server->upp_channel_a_recv == false) {
) l7 ?) r( P- \4 o        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 P  p7 x7 j4 M- k" Y! @# m; m        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {/ x# `- a: h: \
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 W. C$ z) X; h, J9 f4 S

4 g$ |' e1 D- U: s- c" _# ?4 {$ }3 {
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ S" \& F8 ?, X. A, G* r5 r  m' }% i  Q3 H. h
            server->upp_channel_a_recv = true;//: c) j# M- P* C- K. n) d
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);! q9 |5 {1 m0 q+ N# @6 Z* i0 V
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
* S  a# X( q. F' s            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;# r' d; @) S: J
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//' Q5 k2 `9 j8 y/ E. k* {/ j

( W. x; x' r0 p/ j            upp_error_count = 0;  j$ e& w$ d$ R1 t* X2 m9 [
            upp_dmai_int_cut = 0;1 q+ ^# Y$ m) [+ ~" v

/ X3 I6 u6 V  t) X0 ^8 q3 X            // fill in data 8 I1 C: {1 u- d8 }8 Q, `( H2 ]- D/ h
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);) t* i# c/ s9 H! z& k  P7 C5 {
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");) a6 z+ E  K* W" B( z- h) ?
        }5 f0 R% N& Y4 a& K* u% w
    }
9 i8 w7 ^# |  c/ |' I7 V    else{
8 T+ u1 h; w* K. b9 b2 {9 v        if (upp_dmai_int_cut > 0){2 V' m6 X  f1 V- g8 s! |# s, s
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
6 ^& D3 z7 y' V3 g9 @$ b5 n            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);; j) b$ X0 A" f5 a6 q2 w- E

+ G  F! ?5 A6 c: D5 R  h2 Y, S7 l/ ?6 w! M& x5 h( s& n7 J
            //copy data to upp_recv_list_busy, z, K) p: {$ q% ~$ B) W3 ]
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 _, P. @' ?: f! d3 k3 [
: h2 M# l, `2 S8 E6 i+ f( |( K            //0 y" ^( I2 k: `. h! q* M- ~% T+ Q
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
) l+ p) B8 K: I& |
4 _; X) `; q/ C# t* Y            //5 F. {# q0 T3 M. s" c# \* v) V
            server->upp_channel_a_recv = false;//
  J8 l, r4 G3 e1 }. a7 L3 q) ^
# B! w( T: i! _1 d9 T2 t            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- S9 G9 v9 k9 T* I        }
! v" B9 ^, b; h% {    }8 r! [  }' W0 e2 }; [+ D# R
! ]$ F2 ~" x! m/ T& F
; V0 M6 b- R6 J% k( o. M1 p
    return true;
; x+ L# ^3 Q* W' d# L}* \! _" b1 k4 e8 ^8 s8 X
% e5 _# g% Z3 e3 n& K, f
static bool server_upp_data_send(Server *server)
& I! {. M. \; z* J9 _2 c# o{: N  o0 u. E  z/ g, R
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){" x$ a1 C$ a/ v) y: o! V
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
' L+ g6 Q, u9 ?5 I3 [+ ^- I' @& R        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 L$ X: |, z# a* _; o! P7 |: F
        char tmp[128] ={0};! c) y& l8 X* `! V, Z/ ~7 k

7 \( n9 _! T8 I+ t* H8 N        server_msg_send(server, APP_CMD_LOG, "upp send: start");: H1 u% |! M# e+ X: V- |
        print_log(server, data, 64);& {3 d; f9 v% N: x5 F5 T
' |) r* t, l! ~4 f4 Q% _7 G) `! F4 w
        //9 B& N, W' S. _# n) H# h
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
; v# {: ^9 r+ b        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
& f1 j3 s; C; }# B$ f: R' b        print_log(server, upp_buffer_b, 64);
2 v4 N# `& I: j3 w, f: X: j. }, s5 i
; K& w9 S7 a, w; e3 E; B9 H* x        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);. U$ x4 l4 N. N6 l- q
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; * \& c& _: |1 c% X" m
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 c+ y$ F+ f# x# k& S/ u0 E0 i        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 X9 X" g! o8 V1 n
3 ^* }4 l2 X9 o& Y: |        memset(tmp, 0, sizeof(tmp));& Z" w9 H8 A7 h4 ]
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' W/ X1 c5 A- S/ q* _0 z+ \
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( r! S2 m% W4 ?7 N8 T% R( [
        server_msg_send(server, APP_CMD_LOG, tmp);! M3 S* v4 L& l2 m+ M( d
$ d6 g: p; x3 T- A; a& l
        upp_error_count = 0;
; [$ Q3 c& h' M  ?5 \% k3 o        upp_dmaq_int_cut = 0;
; k% ]# A1 D4 ?* }2 b        // fill in data & ]: `. R; P' u) i; v, j9 s
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); % q' \3 v& d+ N; v) N( C
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");9 W, ?. ?. C9 U. z; {4 m2 i9 u

5 x1 A% n8 N& A' J" g! t- Q1 O$ [        // wait send success& d  J; ]( q/ K! j0 c
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
" Y9 r, G3 _, m5 x: S: T
4 {1 s* |" h% ^4 [; P9 \) N, s        // make data node in free list 0 F* ?3 h- G+ Z4 M  P
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
8 {$ b! Y. T$ k7 p8 v/ \        server_msg_send(server, APP_CMD_LOG, "upp send: success");+ R' Q9 k/ H& j% G" R
    }
+ ]( B* F% ]3 D0 r$ T$ {% G    return true;1 V3 J6 g  z6 b/ u$ _* w: b
}) Y! P7 H  }/ f. G

4 ~. c5 |! y8 q2 o* v( m/ ^

- F; H) n& E/ B" t0 Q$ k7 Y
# z5 \$ ]! f3 \

" P! @7 `% ?. X: B7 v& i+ f# L+ T) e6 r  R# n6 }( k# z; K, t* S

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
1 l7 u# B$ V8 p1 ?' \! f/ g- Q, C# l8 W2 [- D3 G4 S  L

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-4 19:34 , Processed in 0.040349 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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