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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
# s* Z! b( _) e8 V: p6 R* a8 C& Z* a
问题描述:8 N, I! E) f! X; b
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:6 c' L" N! K* U/ d$ E
2 c+ t& p0 o3 C
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 F$ M3 P0 \& A- `/ J& m! c* L. M6 j% ?7 ~! v9 b
测试结果如下:
8 [$ S1 ]+ u- [138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( v, q$ x' w, k8 l' Y

' m4 N9 R9 v% b' b
& s1 b. X) J1 W1 ?备注:$ _% a  N+ t) ]" s- J0 y
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ q' z: \' d6 X  \+ B- S# @/ r
2、相关代码如下:
" F- f- u7 t$ R# n3 X//UPP DMA缓冲大小512字节
! n) {2 L% H' m% p6 U#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ B7 x3 Y+ w! G, H$ }
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
. P) O: T% E2 [9 y#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" W8 m" T$ I! [+ r) m9 D2 |1 n5 R( U9 T4 u5 t8 Q% O
8 j$ c6 E' [+ ^
//upp接收、发送buffer
$ a! Y) K& i. D3 n0 e! g#pragma DATA_ALIGN(upp_buffer_a, 8)
& ~0 w2 v9 a3 k) k5 r% d$ h' `5 G#pragma DATA_ALIGN(upp_buffer_b, 8)
' Z4 f8 O9 I% }- v" w' j1 i+ t1 G) _. C( F2 a" \8 k3 F: S
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];8 n  ]8 S+ _# M& T# G( q
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: ]9 S" }$ R7 r! r$ i) x0 @1 t+ @8 H' }

4 Z- Z5 N/ c) n1 ^6 B, n& }1 n; F
9 r! U2 H3 b8 x( b. m. estatic bool server_upp_data_recv(Server *server) 8 n* C8 M: m9 C4 w
{" a& l. G8 F; u* D9 }- e2 \5 Z" k
    if(server->upp_channel_a_recv == false) {% v: P3 f" [+ E0 `3 l' _8 f
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");7 M% {2 y* O9 ^( l, }! B, c
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 Z$ W: }5 u, c1 I3 u+ b' C
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");, [8 L8 q& U* Q

) y" r7 x: _4 `0 ?, P5 t: k, L+ |, C: W8 \, B8 Q# r/ e
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 l7 t) P  s$ W0 J" e. M  @
* @3 R- C/ l3 {, K9 U( J, G5 n& @8 o
            server->upp_channel_a_recv = true;//6 l5 W  {8 }7 T) A( h! Z5 \
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);; @& o7 s( J8 H3 l& {" @
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
4 S# W6 a: N* U) A            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
: A( V1 Q! r) {            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
/ c& v% N+ J# Z5 u. S5 C. ~' X3 O5 J" P9 [
            upp_error_count = 0;. g4 q, q) G9 \
            upp_dmai_int_cut = 0;7 L, e3 g5 O! g( k1 H" G' g
) P+ H& ~% p  ?1 _: h
            // fill in data
5 w; \: N- a1 A5 [  I7 c            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. S" _7 o4 M; M6 S            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
6 b! l1 G4 w  v' W  D        }. Z3 k0 g' I( y9 c: }
    }
5 d& c1 a- l' l2 U0 L. E1 D1 W  z8 {    else{
: A5 e. q$ J4 S; `; }+ B        if (upp_dmai_int_cut > 0){
5 X- T# }& ~& g7 |3 p& q7 J( P            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
8 z( p1 B0 U" S# Z, d: j            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 H. A& o$ ]. {3 v1 ]
% O' q2 S( R& s2 d* Z8 U
3 @. A' k3 _* l' V# {6 a7 u3 F4 V
            //copy data to upp_recv_list_busy
( g' {" J9 D/ o8 l3 n            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
$ s1 H. Q" {% f
: L2 d5 J: l6 B1 u            //
7 K1 ^: Q$ s0 Q* V- A            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
1 v: c0 _! h! [% s2 }" Z$ R0 [8 k3 q1 f. [7 Z9 k& b* {4 s1 T3 V9 b
            //& A% X6 E* O2 X4 \6 W
            server->upp_channel_a_recv = false;//
% c2 p: v9 y7 w' C6 |! T$ t0 r1 S9 p; J4 H
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
9 W* P: h/ k: B  _  Z: n) V9 [        }6 n% Z/ {- Z7 X7 j! d
    }
/ P3 k! ?( T5 E# G" @1 }- u) ^# ^( K/ k: f( X- X

3 Y9 @1 P9 d0 A) j4 ^; N    return true;) o* h" a  F: S
}: @9 c2 P7 ~0 l7 o3 ], d

9 ~& ~# z6 M. k% rstatic bool server_upp_data_send(Server *server)$ Y# n0 t; H$ l  ~: q3 i
{7 |+ N% }  l6 W$ y
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){* Z  a: [) ]7 M2 W+ P
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  s( t! |' J, M/ e- o5 D
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
) P. M- j! n1 n4 T$ i7 F1 D9 [        char tmp[128] ={0};
+ l) k9 Q/ B0 f% G- v, E
& S% U# s. _7 K. n7 B. _& J        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" M  b+ Z7 u$ M# |# y5 P) J        print_log(server, data, 64);- F1 r: W9 H( k9 w

% P5 J$ {) \& U% q  n  A/ L) b        //) e% [- |5 W1 a( d6 L
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);7 G7 M* T( z# y/ e- t( e" i. j4 {+ M
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
3 L7 S7 t3 D$ H7 L: ?% M8 j        print_log(server, upp_buffer_b, 64);
: o% c5 u( G0 n& S! |1 [, g* w8 W8 \0 `8 F% I- ]0 ?
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
. P# a3 ^& z& w! m. ?; |( J        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
4 l7 O1 G9 p. t& Q( k        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
. ^6 E4 A9 s( w' r- K0 m# \        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
2 Q. P' v2 Q; \3 y+ t" w. b4 q1 C# i. h
        memset(tmp, 0, sizeof(tmp));, g3 Y" Q1 B% ^9 I" ]
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ; Z0 ^5 E2 l* z+ V
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);. e$ x+ o5 N+ h7 l2 j
        server_msg_send(server, APP_CMD_LOG, tmp);" Z! P) Z1 d$ i/ b5 u
7 G+ W6 M# R( O6 f; v! U5 [. T
        upp_error_count = 0;
4 U  I, R& H0 p% [2 ^        upp_dmaq_int_cut = 0;
5 s4 e% U2 S7 m. C: a9 M( T2 G        // fill in data
+ N% @) ^& l: K+ O/ a: R* P        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( V6 B4 H+ z3 E9 h7 @
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
& l; X- J' y# d! e2 S( K) n$ ?  y# }) Z7 |& ^. U* _
        // wait send success/ K- X1 Z  t  O' F7 W5 J: |
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 E; \4 m1 Z  D% Q! p

8 ?  \* l/ q% e( {) x6 n% l& E" ~        // make data node in free list
- o" V. I# O6 ^) {$ Y        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 G( S# p5 @4 ]- Z$ d5 l        server_msg_send(server, APP_CMD_LOG, "upp send: success");6 W( h, j7 U; p$ T
    }5 n$ I* ^/ C* ~4 V+ m4 Q
    return true;7 T  b# u1 j/ P$ v) L' W
}' V' `8 `! Y/ _5 E' q' D- F: s: j
- e, C, j! E; T4 z
. n  K7 H5 u: t( p% g) ]
( s8 ^  o5 u; W  I
5 A9 D' X# W7 N4 O* N8 m, j' ]
( s9 w$ B' Q0 s9 O

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
" L, W  ^9 O5 a" {- ]$ E& I; C; w

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-16 07:55 , Processed in 0.042716 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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