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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 9 K  \) p. X; V* ^- p

9 u  g' g& b4 t3 i问题描述:+ ~- z0 v) ~& K$ k' \4 d8 O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:' c: _' |+ b& F9 I! m+ ^
. R$ s7 N; y3 z3 u) b
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。  y, C" A& C) H% h& F2 y$ ?) m1 S
5 k; O6 p4 P9 O3 r- f& t  q. s, _
测试结果如下:
8 R: m- h. E1 j, _, W4 ]- X3 U138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 r  D7 k$ l' q5 r* A  @
$ y0 R8 e3 h( W- ^& m( z
  j! Y% u" s, S  R# Z( J- C6 {( B8 @
备注:. Z8 I/ y+ A$ S/ e3 X3 o0 j9 J* D
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* C) f  V, w! M# Y- `  Z
2、相关代码如下:6 M) s8 Y, D% }" o) K
//UPP DMA缓冲大小512字节
' G- q/ s: x3 C. E4 r2 g! w#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍, J" \$ m1 y7 s, d) @
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ ~7 f5 q3 q, [/ I6 h) L" J# R#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)9 z0 G+ U% ]! d' Q! O  h3 X
$ w$ r) d1 i6 x" r: P6 d+ E5 O0 r

, T, n- s7 a; A  }//upp接收、发送buffer# V8 {* T( W+ M9 ~4 ~) X$ o* F( f
#pragma DATA_ALIGN(upp_buffer_a, 8)8 @, s2 |% e) v9 d) Y; F% z* z
#pragma DATA_ALIGN(upp_buffer_b, 8)
8 w& h/ S0 Z' W0 A6 Y' y( b8 N. b$ Q% Q# _0 W
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! j( l* G' w- g6 A
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; n- {- o; h  N5 S+ ^, V
6 U/ o( C$ ]; u& e
6 f( j1 i' I) K0 [  Zstatic bool server_upp_data_recv(Server *server)
- x6 V5 S% d  q8 p( ]{
  S: b4 P$ x$ T1 q0 ?$ {    if(server->upp_channel_a_recv == false) {7 E3 ?, I9 n1 |2 c
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
5 T" ]4 {, {2 w- m& L        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 X! v9 u/ \6 k+ T
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ P3 l% ^: _+ y9 N: @) f& ~4 A' A
$ M! Q# z! }. E
& J5 }6 l; \% d: S8 S
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  g) D% v- ~1 _5 ?, [4 I- u' t

' B8 b4 f% Q& Y  _  `% k# L& R            server->upp_channel_a_recv = true;//
0 D6 V  o6 x" m% {# X+ U  Q            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
- u& x) Q4 p) U5 n3 A; c$ B            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ C9 M7 C5 `2 @* I7 ~/ @$ _) T! g, w& h' S            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;. f: a# s, S3 z
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 u+ {9 g! |, I; l4 a* T+ Q! c8 u! }" l" N4 G3 F) n# k5 e3 L
            upp_error_count = 0;, w, }/ @: u7 W  e% x
            upp_dmai_int_cut = 0;
' B# O' t$ W4 [* ~
! H; _0 I$ o* a0 n            // fill in data 5 v+ d3 ^4 B  Q, `
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);: M4 u, w' ~+ W6 M% E0 t3 A
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
$ N0 t- v$ ^8 H, z        }8 R+ b" a2 ^3 F% k* y" h1 \  P; a9 I+ b
    }2 t* F1 k% t, t. A* Z3 C
    else{
4 R0 _6 q) b6 L  [8 q        if (upp_dmai_int_cut > 0){
) g1 \& v8 @# ^9 W$ x6 ^            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
& R6 D$ e$ D0 Z4 f& W6 ?            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# F+ I/ x) S+ L& k
6 i, g! U4 Q" Z( y1 ^9 `+ o  s7 ^( H  [
            //copy data to upp_recv_list_busy
3 b5 |4 U) F8 x+ S$ V            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 W# d4 @) x1 u" P1 O5 _  j- E
1 ~2 v6 Y# ?# K% J$ S            //
# @6 d4 ^* M- j0 ^: K% R            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
& \! q4 I- |" m9 r8 s: J
/ M* i- @) T2 c8 h' ]  b: a            //& Q5 N" |0 u6 u# Z
            server->upp_channel_a_recv = false;//
4 v8 m- g5 M& }" N: n+ I. P& q0 f9 C4 j. o" T* y7 w
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");$ P6 ^; N4 [, X9 g
        }
) [, }% g# Q6 T" u. F    }
( s' K4 O- K8 }" o  d
% T$ ]. S; i$ O2 x5 Y& }! R. k9 e
    return true;2 B! [: P0 Q+ m0 R- Q$ N
}3 b5 F1 w# N7 S5 I5 [  E

3 W* s4 d0 X6 Mstatic bool server_upp_data_send(Server *server)
. w( z5 L) Z' e1 j{2 \0 r- x1 h) @2 [; s  o: [. b
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){$ o, d. m) a- |4 L) P
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; G! Y! @6 z9 U. L5 q7 U1 }        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);& o& c" [7 D0 _# N. m
        char tmp[128] ={0};
: m% f3 ?# \7 k& M1 T" z% G+ ^4 v, u5 p. B) ]; g
        server_msg_send(server, APP_CMD_LOG, "upp send: start");4 C# S2 q5 ~' Z% d$ D1 p
        print_log(server, data, 64);
* E* A& e/ x" S& V; p, M6 y, Z2 ^0 x, {4 R2 ~2 z3 h( R
        //# B+ E" z7 Q. s2 e# |
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( @  t1 E# G2 V1 V% l9 h
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);6 p& P$ h  ]4 g- V: d/ n6 u
        print_log(server, upp_buffer_b, 64);% e) m2 ^8 k- D7 O- `* b6 L  c; ?; B
, p; i4 w0 F$ m' ]: b! P
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
0 H( d2 M. u9 \2 m" m( G! {( r) O        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
$ F6 J# ^. B, Z' q        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
! c! D4 G; s' k* H1 e        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
9 r. }. ^6 O# r: ]6 u' v
0 q* ~: l, T  P9 n4 d8 |) s# s        memset(tmp, 0, sizeof(tmp));2 }: b  ]; U; q9 |. U
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", + G+ ]! o, x! l
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
: q. `: x: L" q        server_msg_send(server, APP_CMD_LOG, tmp);
2 y1 i: K: Q  h9 d- h  w% h8 \4 p! O" N
        upp_error_count = 0;  I$ b9 P1 h% q" ~
        upp_dmaq_int_cut = 0;$ h3 k5 p$ `) I& O7 c
        // fill in data 8 f7 t& U" {6 ]+ O' ?8 u) Y
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
9 {" k& b* R+ _) X" y        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 t. g% U; `4 z7 p7 [. J3 U. F4 y" e) Z- J/ ?
        // wait send success# W6 L3 K7 C& Y1 P( ?+ w$ G
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) z$ v/ Z* [( P+ i
; K" f! N, I- {2 `$ G        // make data node in free list
; }( W* v0 T4 ~! Z! p) B        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% c' b; I$ T6 l! O" {
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
2 Z! v2 |  X; D    }" d) v3 H2 a" I% @! C
    return true;
# [/ A" F" a; _. e}& n7 L: [! I8 j; u% h% U: D# G" O

% ]5 z9 s5 f% w8 O( }
- S1 e" i5 k+ i. K+ ^( d
$ }: b3 W) D$ n; ~( H
! P3 V5 Y5 ?+ e: B: ?: h

( E6 R+ G9 }" r- |# a

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐1 ]0 m  k  }+ g# k5 p  e
2 a( D8 ]* G, t% q/ [5 k; m6 |* l

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 16:04 , Processed in 0.040578 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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