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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ' v0 Q7 u7 B2 {7 A& d" U3 c6 N7 C  S
$ N* G0 D; e# S0 W) {4 K  U  k8 R+ u
问题描述:
* m+ ~. ^, x; s. o: ^在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
, r, v# o' j, e" w* y( }, L8 U# [- b2 \8 q+ \3 j* L; H6 q
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。4 m+ J* d8 y% \- i* p% N
8 r& ~) ~( X$ a. x. T
测试结果如下:0 C& L; H5 Q/ r6 T$ _: U5 P
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 w! k  c$ U7 o2 Q, z' t. }
9 D( e4 [% a! {: U
1 p4 k6 D9 W( @7 J- _  a
备注:
- _# K- N+ F6 c9 w+ C! S! L# i1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
; c7 j5 _" h3 Z- f, a
2、相关代码如下:+ x0 z1 }" A2 x6 t5 P- w8 D- @
//UPP DMA缓冲大小512字节
; h6 E- H4 f+ Z6 X3 r8 p1 w#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍9 s, A. _/ V: |2 P0 w2 `* E2 s
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
$ S8 _: R; J# R' N9 Y4 Z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 B2 g9 ~% p7 ^$ q
* R8 Y' g5 j/ q- V

+ p6 q6 P% L9 K# Y: P6 D  s7 O( U//upp接收、发送buffer
+ r9 @, f$ H' g+ I) A#pragma DATA_ALIGN(upp_buffer_a, 8)
+ M3 V( G" E/ S9 @. a#pragma DATA_ALIGN(upp_buffer_b, 8)
3 X% j+ c2 L; n0 E- \  z5 [7 N& k; z) z) y' j6 F  ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" g0 m6 F5 I7 y+ Tunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: N4 ?: Z$ R  G) \* J0 J) C( n$ v
8 |" z3 `, l; U
9 i% i5 U; H' ~; O+ s1 I' S1 T
static bool server_upp_data_recv(Server *server) 3 e/ c3 x* L; Q, b( F
{
, l0 I+ n' R- I) r    if(server->upp_channel_a_recv == false) {
8 f  s; ^0 [( `8 `0 h7 X        server_msg_send(server, APP_CMD_LOG, "upp recv: start");  Q4 _0 r8 a. o6 f$ h# x6 b3 k- B
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 `. N! f4 a& j, g+ z+ `  }
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ [+ z3 ^0 @, ~. |$ j
; r6 x# }* I* L* o
+ v; m# _; ?4 G7 N8 I) \            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 y3 R7 H' U0 {. ]6 O, K' w1 X5 N3 b3 c# p
            server->upp_channel_a_recv = true;//
, {$ i& P( J6 K$ @            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
9 \, ?) ?% H/ @  E& U            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;1 `+ z  Z3 V( e4 E% P, g
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
7 n0 ]% [  D) C2 o; U            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: L1 K) g9 `/ c1 ?& e# R4 G/ E4 f
- P5 f3 l5 ]+ B- @
            upp_error_count = 0;
( U' y, `$ J: S9 e+ i$ i; g4 o: n0 \            upp_dmai_int_cut = 0;
6 e; {' q& {$ t2 M. f
: G+ K1 g( p! s6 M3 s            // fill in data
& \# Z0 d1 y& f  L1 I) H            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. d2 _, d: [, P- C
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 S" {6 n' o& t( _5 s1 }9 `" b6 e9 o        }7 _1 v1 v8 o5 }8 _1 N$ U  Q$ N* m
    }
# ^& R- O- g! u# y8 S) f    else{4 U* s" [! w6 E+ k
        if (upp_dmai_int_cut > 0){5 C  z7 c4 [  K9 y# f: V5 T
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 b9 @: T- h; D' ^' x* U, g            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, ~$ x  l2 v2 F! s; l/ F' e( C7 U4 |9 x# W% B' b; }  |0 U# ^8 w

: l7 w, t8 D: o9 ?  Q9 P: r! g            //copy data to upp_recv_list_busy9 H0 t4 R, ~* P* d# _4 P( f  K! I
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ O+ Z& ~1 l# z' i4 `6 Q8 R' Y% v' u9 P1 k! u
            //% y4 M  Q; ~& p+ x
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 x% P: @+ Y. J3 |+ h
% ^) v8 Q0 {0 M  [0 R7 o            //' H* S" W! S+ _: L5 L
            server->upp_channel_a_recv = false;//
$ E! p( ^4 f. R8 ^( O. h1 N  z6 B+ e+ ^2 f; x$ }0 {  T
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
* T4 U4 r" d/ e% w; r& ^. |) a3 ~  y        }$ ~$ A8 \8 Q3 V9 |& F
    }3 v7 T, ~+ A  e$ {) c1 o6 r0 V4 G

5 c' U# p2 H$ N0 a/ k7 z7 n+ C/ j! i$ }) M4 p8 Y$ b* m
    return true;
5 ?: ]  @+ e) _. b0 p  p+ b}/ Y4 G. }5 q4 l( G

% g2 b/ Y2 P' c: i6 y3 h. K1 U& Lstatic bool server_upp_data_send(Server *server)
6 g# j* l. F( U# `& v; E+ E{. N4 I" z) O4 b! M
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
  E; S' j$ M1 A  x0 C        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);" }+ ~4 _" N) k7 p( q  w
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);, x$ x9 G# j$ `  _! v* c2 s' q
        char tmp[128] ={0};
. q5 o9 _$ l* c# C3 }. U& _7 m# }6 c- y" `9 d! Q1 c# N* r# P
        server_msg_send(server, APP_CMD_LOG, "upp send: start");/ @* a2 D  ?" H$ g. i+ s
        print_log(server, data, 64);
  t1 z3 k* r/ X/ H5 z% ]7 T5 u; K4 \$ _: v( T
        //
) {& ~7 d) N3 I$ a' \8 L! S        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, Y* B9 P* m! o% J" g9 h3 x
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
0 o- N  Y( I+ _        print_log(server, upp_buffer_b, 64);7 g' q, x+ ^. u% j
: n9 U5 v8 i. D- i( L( U  D
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);7 W, }- j$ G/ Z% K# ^
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ' Z/ U* ^1 F2 \% C4 T) r3 Y
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;- `, W) P. X& g, N. Q
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; A, _. N* D6 T# V
1 a; r  G  o; _4 w
        memset(tmp, 0, sizeof(tmp));+ v" P9 |9 m8 T+ r7 b
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 y+ c# ^  W$ ~5 `: a9 O1 ?1 w# z            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
4 Y& I' B: z0 U" [0 q        server_msg_send(server, APP_CMD_LOG, tmp);* z1 W( H% e* h2 U4 h
4 T% T" R& B, T2 }8 U
        upp_error_count = 0;  g( ^) F& j2 b, a2 V- H, j5 T
        upp_dmaq_int_cut = 0;3 Q' a5 ^0 R. e7 n9 V3 n
        // fill in data
4 w! V' \' k  Y" o        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   p4 d1 K7 ^  ^5 Z3 Y$ B
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, \: `3 m5 S, P% V% _' u& M1 `  Z' k" y" ~! j8 ]3 z  k7 d
        // wait send success
( u6 j: S1 b4 l  l7 e* S" ?# h1 N        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
2 _+ d' h2 q! M. u
$ z5 G. v9 o5 n* E/ p" a  G        // make data node in free list ( J/ l1 X$ z- Z& L+ ?! e
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. U4 ?% }; G( E5 E" ?7 w        server_msg_send(server, APP_CMD_LOG, "upp send: success");2 R6 x  t& R3 v: Q8 E  F
    }/ Z# w+ K1 T; A3 w/ T2 }: Z8 t% t
    return true;
+ ^, m6 Y+ f3 }}1 k1 l: C1 W) S0 _

8 Z) _& V& G1 J

0 M: q+ E* Z7 l) ]- ^% ^! j0 z# E, Q

; p  t6 G+ J" `, w# J1 @' v7 C- d8 F
. b% Z9 j5 A) S! g- q* n2 ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐1 A- W( {+ Q" q

( f$ E' ~: X: H2 P

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 02:39 , Processed in 0.041646 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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