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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & Z, w7 C9 |9 C) L! h! r3 U
7 ^* ?3 C' [! G2 Z9 D$ G
问题描述:- n8 f. R1 b& i/ j) m5 \6 x* t* a0 R
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:$ |2 d) J% C7 F4 o2 x/ d8 t

) U; K8 C* j3 }6 [, [8 v' N5 Q1 U! I: k图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. I' c  Z- U- a4 W9 a; K7 Z

, ]: a' T$ V2 Q) P6 s$ V' m/ z, y测试结果如下:. P; d5 o$ U5 i# K% v# G* h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
3 r, |! w" t' S1 a* Q$ Q& G( \5 G; z" h/ ]# j1 P2 _

2 C  ?5 ]( }/ N2 q/ p备注:
8 B' Y0 W( L8 }& H1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' R) r; s3 ^; i
2、相关代码如下:% J" E. _6 Y2 K. m- D; @# \2 U3 {
//UPP DMA缓冲大小512字节
" Z/ D# N7 B! g' \0 E" N#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
/ M- h3 v0 r" h- k: w9 Y; D6 c#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
( F, `- K& l: ?, _& ]  s3 ]#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 o$ |# A3 f4 I3 U& [
, s, _% ?# J6 J8 ]( i3 K0 H

- l6 R  s* `+ J; m% [3 h: Q//upp接收、发送buffer
5 R& C* s- i; v  `#pragma DATA_ALIGN(upp_buffer_a, 8)' A' ]$ g8 l  Q( @, J
#pragma DATA_ALIGN(upp_buffer_b, 8)
) @* f- ~1 T) ?3 m5 Q' n1 X4 i5 k5 A3 k( a7 X- v9 V, m4 `% A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 r6 @$ m. B% |unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
( J7 o# N. V1 A. g! M8 n5 B4 Q# w! N6 h+ B

5 V7 a) W& @1 B$ Z3 s! Cstatic bool server_upp_data_recv(Server *server)
1 E3 P1 i/ O/ N2 G& e/ Q{
* `& m/ L& k* ]: S* f2 G$ j    if(server->upp_channel_a_recv == false) {; a' o% K! F! t, V3 f5 u6 @
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");3 p7 M/ Z0 B5 s/ E2 _+ e& ^
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( q/ I" w  r1 j. o5 j2 s            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 J9 S/ a7 A4 t! {6 Y
' `4 c) b/ \' t/ a' }  W- l; v
; `8 R8 e2 b/ Z2 _            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
- E7 d4 A! G5 o$ y2 M( R
& J7 K+ n4 B! F" R. n2 c            server->upp_channel_a_recv = true;//7 o9 ]7 f: D0 b" U9 ^- e* f9 _( g0 n# X
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
4 a7 W; q/ {7 z' O: n4 P            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;0 s1 K2 A- f$ Y5 _
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- s" h2 E) R: j! q2 K3 h% Q/ K            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ \: b* f# k) r3 E# k9 `' `1 L$ P9 y4 Z8 c; r9 U
            upp_error_count = 0;
* W. Z% Q, c, {  ?' s            upp_dmai_int_cut = 0;
. d3 h. B6 K* ?* V4 J
' t' d# c  A% ]! B            // fill in data 3 h7 X% x$ n" }* d3 {7 G) O% C% b
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);# A, h# p0 K5 Y+ @6 j+ k3 W" L
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 F4 o3 V$ z0 p2 h* Z) f
        }
2 I5 k. n* h- A/ a; j. y+ e    }' `- Y) q. e7 E+ @8 E9 e- X
    else{
; k5 @  x- f, Y0 k  E        if (upp_dmai_int_cut > 0){
7 k4 ^3 E8 l+ f* Y& f9 V            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ C7 O6 a& U& S            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ z& _+ ?9 x- r; M, R7 R
) q+ ]8 M8 g6 D9 K. f% q& G7 }# b1 O# H% X2 z+ _0 v( @2 n2 S: g
            //copy data to upp_recv_list_busy
! J/ V# d, ~6 C- Y            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ V5 G* E( [( O5 Y/ |
3 s1 O! V* @! o& N1 o: @: W1 b: L
            //) Y9 M% V" |% S  o
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; g+ }2 c1 o9 G: q+ L; z3 Q
3 }: ^# S/ n8 i            //
* W) H3 P, y9 [$ S  x( b! f            server->upp_channel_a_recv = false;//8 T8 M! a7 L1 W( y( ?) }7 a
/ I# l6 \$ m' w8 f3 \
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 G* Y/ R  `/ X$ F* }/ W        }
- C* u+ f' E  f- h: X- c, o    }
! |, W/ M$ T  d; w
: X% u" H# F2 n( h4 a
' M. G& K  @7 ~1 ?6 S    return true;
$ \6 W6 {7 t; L9 z! D/ [; Z. u}
, h( Q) A* E& X6 O0 |/ Y% {) U+ _
static bool server_upp_data_send(Server *server)
& l; r9 \3 n) `# m! N; A{
6 C4 M8 m! Z0 A2 M    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
7 T6 f2 C' `/ x3 y" L1 w1 j* A. {        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
0 y9 B2 ?3 \. h8 P        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 w: B3 D& D4 F  K9 w2 `) z
        char tmp[128] ={0};
5 u3 c* C& E1 P, a1 C' y' `* _! S# A- i& x# s7 q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
& T. p) `' X; v, l6 U8 n        print_log(server, data, 64);
0 L  J6 e& r5 c0 c) W) F6 [; Y
9 k3 g4 x4 c2 ]9 }$ I% D9 W        //  z, R, H7 p- J
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 @1 j/ b- n5 F5 C) }
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);: K' W, J% n. v, E( b4 _9 D* v3 C
        print_log(server, upp_buffer_b, 64);( p/ C- C1 O; X: k% J# @
# h# a3 r9 K( x/ |
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);: I( `2 [- y( g3 v+ O! u
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 8 C6 ]8 y4 b& ~1 q; `
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 s) M( ]! _  T8 Q2 L
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 M" J! u; I4 p9 Y+ E( ~, O5 T2 @& {4 i
        memset(tmp, 0, sizeof(tmp));
" ]- w6 P9 [9 R, u        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - d+ h1 t# K- _5 F
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( ], Z9 W) l# u9 w( I
        server_msg_send(server, APP_CMD_LOG, tmp);9 @# [3 b+ ?1 r; Z- d5 w: j2 }7 k& X
7 o" p6 L1 k4 l
        upp_error_count = 0;3 N, L/ a9 t) H. D8 `* o% N
        upp_dmaq_int_cut = 0;
! W. e" j0 }. _8 o6 y0 ]  j) E9 l        // fill in data
9 d( x1 N) s, o& `" ^- C        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ( l" A6 V9 y% x, s' s6 `
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 G) ]6 g" D! f, ]6 g

7 c- V* a) S4 n- D4 x        // wait send success; `, h7 l8 K5 c2 |0 h/ |
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! K% |! v8 H2 r, _& \/ O8 R7 o+ U- [( `+ f
        // make data node in free list ; b( f& O9 A5 V9 y" Z
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);% M( G0 C. b0 X4 ~7 c
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 }6 k1 z6 y1 @6 {    }
7 S! C2 J& Z/ ~    return true;* O% W/ B& R& [* l, Y0 b
}
' Z& \) I( X9 c
8 P7 e) f% Z' X0 N5 A5 D
7 x) O% R4 ?+ Q! R/ @

5 I* T2 B6 O* R- j

2 {% I5 A% R, a, z. F/ _! c+ q8 A; Z! B
' y0 y  U3 w# S2 o4 ~, R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐  D3 `3 M1 I0 Q( G# U, [" U7 B

+ U8 I" ]# S5 ~- H1 Z9 ?$ K8 \* A7 V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-12 11:51 , Processed in 0.043401 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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