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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - s# I! a4 W  ?$ ]" S% c4 E4 X
& k) v% f  Q3 }" G
问题描述:
0 g; `8 H% J& S3 [在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
: j. ~. H$ j7 _" ^% W  W/ O+ R, N
/ B- M1 \  U1 D5 z1 f* {/ X图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 u; z1 G0 d( F5 ?% @& g' L
) W4 b1 W0 l1 p
测试结果如下:
$ }$ [/ e: F9 C; W6 q1 \0 w138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, k- e# l' m) H2 C( [0 b4 C: L

7 [; F% I! X$ _/ r5 h) n" `7 o: D7 C- p+ f& |( g7 L
备注:8 p0 X' r. D2 |  W
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?# t# A1 g" B; i* h+ @# M) k+ |2 Z
2、相关代码如下:
/ z- i4 W! M  v; ^. b& y8 H//UPP DMA缓冲大小512字节
2 ]0 c0 v- A8 z5 N! W#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
: W, o7 k) o, O. u' J#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" K0 h- \8 U% u) H+ r
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 G1 x. b8 a0 A3 V8 W1 `4 d: J2 t5 v# `: X. u; [
( t9 G: [# I& p; {: e( q: \9 o2 w9 e; |1 R
//upp接收、发送buffer
- L0 O0 t5 f" g4 I/ H/ ?" S; I  D  n#pragma DATA_ALIGN(upp_buffer_a, 8)( }: ]. N* y3 {6 b9 j) l5 \5 B
#pragma DATA_ALIGN(upp_buffer_b, 8)6 V. e3 S  ^" b: O1 Q& h7 K3 f, n- S

1 \, d1 D% K0 z- Qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; r: e) R. t/ v$ a& F2 p$ i1 ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 E9 L! g! Q8 Z& z

3 a+ q# ?. n  Z" n
+ z# c  \8 _- e) \static bool server_upp_data_recv(Server *server) 3 P7 F- _: P4 f( K6 H+ U
{9 M& M8 ]/ y: ~4 J
    if(server->upp_channel_a_recv == false) {8 \/ o- Y1 g  M# E
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) [- x" U, h* [$ [) H! @3 x# I) v1 _        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {( L- w6 d! V4 K% y3 b1 Q% F% R
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ M/ P4 g/ T' y7 i
$ g8 R3 I+ a" P, E) C  u! T5 q" G8 a7 u& L6 ]/ s
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
  P# J5 l4 r, k/ n; D. ^* r  V& o3 k6 h; m" V3 ^
            server->upp_channel_a_recv = true;//  n& s1 G+ q$ N" i6 j+ }, I1 t
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);  D6 g+ R, l- F
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
' {( x2 T2 ~  z2 N; G- K            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;' r$ O( C% G' W3 A" C
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 j) q+ z- A- C7 }

9 b7 C* d( v& h2 j4 I            upp_error_count = 0;+ W% a$ S9 a% S  y6 Q
            upp_dmai_int_cut = 0;% N" }! a/ R& p& ?0 G$ U
5 b6 t+ Y& w+ \
            // fill in data
$ ]7 l" C9 ^5 G( j: w            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* K6 C) G( ~9 w- P: w8 q/ q) {  Y            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");7 t& m2 j/ c( i- f% G, E
        }' C! U$ ^; ~- K2 [/ B
    }
0 D' j5 h" H. N- V' v% ]  y  x- u    else{1 X; F% m9 O" U" P
        if (upp_dmai_int_cut > 0){
% _7 G8 J: V; c; f6 S2 N, R( |            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 M! M* L$ A7 z            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 u  ~2 W! F& j1 @8 U) ?9 ~) b' d
4 r1 i; j, [  L4 I

  |4 @  @7 C5 F3 g            //copy data to upp_recv_list_busy3 |) |. d3 M4 U, C' U3 ?
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
. j/ l/ x& V8 w3 x9 h3 z- t' r5 p- g1 K2 H+ X. ^# w7 k
            //8 D8 {$ n# O* V; K  ]
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ a2 K+ L+ O) G. O8 p! ?' ^4 x+ ?) n) I# u( T1 Z- Q6 \
            //
( [" m+ P9 x! y' c: W2 i# k& @            server->upp_channel_a_recv = false;//8 F7 t. G- [; V* P

4 R- A% }$ Q1 @            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' r" j" z( n- a  G5 [0 U$ F$ o" ]. W
        }
8 D/ s- A: d! N, o9 w/ s    }
, Y! ~1 U( l3 i- k, p9 i5 I- ?; C( ?$ L$ [# Y) _' N6 p
8 J0 H' S+ m0 a, A5 w
    return true;" o; Y: l4 x% i
}
: g3 F" s9 @  r9 n  U. X% ?" u% c7 W$ Q# \& P
static bool server_upp_data_send(Server *server)! K" X" J! o1 u8 t& P0 Z) `
{
* s5 G* |0 q3 K    if(ListMP_empty(server->upp_send_list_busy) == FALSE){( }+ M% [' |) j7 S9 p# v( L
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);0 b. H3 A" |, w" @4 z4 H
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);8 d+ u" J( y, o$ W3 G' x# A9 t
        char tmp[128] ={0};; B: {! X) w, b/ h

! t4 V( u; O$ a% L* K        server_msg_send(server, APP_CMD_LOG, "upp send: start");
( O& b) m9 w- F        print_log(server, data, 64);
) e: F6 r! ^5 c- A, F* w5 h  z" R) F# D1 @% R! @. q. Q
        //
( `% u( s! b5 H        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
, {( I) w8 j  v( ~- @$ d: |        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 J  w# d4 s- G& Z1 O8 |
        print_log(server, upp_buffer_b, 64);0 o9 f7 v4 @# q9 T  A' v. H$ i

; l# o3 c7 \5 N$ s: E' N, h0 @        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
* [/ }- F( ~  X        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; $ n, _1 }! Y) `$ @. q- D
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;9 \+ s, F) r) x- m$ W
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;2 u* J# H5 _0 g- T* O

- v  ]# x' S, M6 C& i1 o( r        memset(tmp, 0, sizeof(tmp));
$ e5 [1 G$ P2 @; k2 [" F        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", # C, k) ~( m- j4 ?
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
1 i# |" I. x* J" U# N/ H8 n5 }        server_msg_send(server, APP_CMD_LOG, tmp);
; L& B: {- ~/ O% }7 f0 _- ]" c
1 ]7 N0 h1 Z& j! F( d8 H- {        upp_error_count = 0;
2 G7 t+ k0 ~2 q3 O' e        upp_dmaq_int_cut = 0;
) f: }9 F0 r6 G4 _5 m        // fill in data 9 V* R. Q3 w) ]/ h: L5 g& K
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
. j/ k% K3 u. Y8 Q  f        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");& p) n2 P* `$ P
8 a0 S5 e9 L" G" Y( D. M
        // wait send success" G1 t/ g9 P. j* D/ {' |
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) `) z& }3 x+ t1 u' c+ X: s3 A+ d; O  G9 p2 h7 j+ P7 I
        // make data node in free list * Z- Z! Z2 v( u. {
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" q, z4 m, W5 E2 y5 v        server_msg_send(server, APP_CMD_LOG, "upp send: success");
: C, p$ {5 A# R! r$ b$ {+ X% b    }, J9 D# T# c1 W7 q& @# d
    return true;3 c2 k$ l+ `5 R7 K
}/ S% U' O5 b$ W9 z
( t2 p" j* K1 w+ z( C: B* [. n  m

4 s+ ^. ]8 K4 g( f, ^; v
1 S  N/ `3 a- R- _: |

4 G8 x& _  E1 b/ O8 x0 N8 K- c) p7 I" f/ U. f" J8 {" r

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐& l( e* w  Z+ v: v; b8 I
( J, E  ]) W; ]3 j. K1 L) m9 n: [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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