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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' r8 f( h  r6 s% ]8 K: V7 `$ o" _3 G! x+ V
问题描述:
% {" \- d5 t( y, x3 v在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
( Q* G% v- L0 P( l
: e2 T/ I& `/ l图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 s( ~% _/ p7 v2 a

0 d1 j9 U, q+ b$ W0 o8 w测试结果如下:
# Y; }5 F8 r+ I0 _! K; P% c; v138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
% C1 y/ ?9 o# y8 E4 u8 N# K- B7 S( j$ _, e4 v6 a# L& H

7 `4 J: t! s! C1 H$ C& t备注:; Q1 U; v3 A/ {, r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 X# }' T8 h) E7 g+ V
2、相关代码如下:0 f% w; ~* p+ d2 a7 Z" S% l
//UPP DMA缓冲大小512字节" H& l$ w: h+ X' S# G6 }
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
! E' x* }6 r1 `#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT+ X) B/ x( y. l
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)& v  a, X& l5 N' k4 f  O

) K: w4 c6 k( W4 ], A
, p' Y( o! t+ K' h//upp接收、发送buffer8 W9 }4 g( c$ N3 b6 g/ T
#pragma DATA_ALIGN(upp_buffer_a, 8)
0 [( G6 f6 O) _5 x+ ]4 s0 Z6 R% E+ g#pragma DATA_ALIGN(upp_buffer_b, 8)* v1 ?! l0 F" d4 A5 I) o- q

3 F- f( ?8 h* Kunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
, R  W/ `. U, s2 vunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
% v5 x% l" J5 P: ?1 A+ B; S- r
8 {" I% Z8 a/ o+ J: `" s
0 ^4 R/ @9 l- n' m% O& Q1 }  x+ e* C" tstatic bool server_upp_data_recv(Server *server)
0 ^0 i: M3 l* u$ {{' ?4 ]  [6 j- S4 O% h; t' a- V
    if(server->upp_channel_a_recv == false) {
* J7 E) M( C) s3 S$ R7 S        server_msg_send(server, APP_CMD_LOG, "upp recv: start");4 }" E# m- [* o/ {
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {! L: o8 `, M  N5 t3 f: B7 z
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
' W- e  r9 E5 T- q
0 W- }4 V; h, G& j( i- P, G1 E' S, D$ k5 A) w0 j3 \
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);+ `  i4 I3 w! t# U- m# L" S
2 ^0 t7 g. F3 {8 G
            server->upp_channel_a_recv = true;//! s6 a) J1 [/ J' n* ?% Y/ n
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
0 h7 i" x% q: E2 [* n/ e            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ {6 o: ]4 m" Y" C            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;4 m8 ?" q' E- K* l' q8 u& C
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
; }  M+ t6 y: a  b  C0 v9 R; s2 C! X! X$ D! u5 |0 i
            upp_error_count = 0;# j; B0 N( m+ B# Y
            upp_dmai_int_cut = 0;
: p6 J/ l9 n! \, Z9 }$ N' }# r- {
3 m/ Q1 d+ a( t9 v8 I            // fill in data
! W/ q9 `$ `7 \) x            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
. f1 e( A" E+ l. l) |- {            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
2 V) P& B7 p1 a        }
/ E1 Y/ O1 g! J) L2 J9 t    }. r: d# x! \$ k3 ]- q% t
    else{
* q1 x, r) c- ~) M$ m8 y        if (upp_dmai_int_cut > 0){. G  @' c8 m! l3 s; z0 _7 `7 ?4 N
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
$ H. i8 z$ N4 h% ^2 l( ]; f            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
! h4 V( M/ K- ~' t# [7 ^2 v" E8 U/ ?! ~6 R

5 x' B- D- s3 {5 G$ s            //copy data to upp_recv_list_busy0 X3 J9 d6 `' S9 h5 h5 a2 M
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
  Y+ b' f0 U7 r! [) [8 w, ^* e7 K; `1 |5 c0 h2 f
            //2 R' E7 ~7 V* d+ d* i
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
9 M, I. T; ~: R/ N) P" u; o6 m0 S8 E8 w
            //
$ `1 a2 i% _$ X! o$ o$ Y" }            server->upp_channel_a_recv = false;//
4 ^8 V4 W8 |% w8 M
5 @& o: ?/ `. b$ k            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; h7 Q! z3 `+ {8 [
        }/ J, x9 ?# K* i
    }8 H* c  u1 Q4 {8 E1 f

' c8 }/ V( r! t, z; o' Y
/ @3 k: X2 v: o( z: Q8 C9 ?    return true;* Y. P& r6 F, g1 J# R# \& a
}
' R4 V& M4 O7 x2 b: R. v: Z' n; n) `% _4 w5 e6 u/ W
static bool server_upp_data_send(Server *server)
/ w1 ~0 u" ~% U# G3 k7 c{% B; H1 N9 U- ]9 l7 g2 J
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 Y3 d+ R0 X7 C, F9 X        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);2 g1 Q! q& E" o8 a/ Z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 {9 A% a$ z/ b6 ?! N4 C
        char tmp[128] ={0};3 ^+ P0 {* N! O' Z7 y# v' j. e
  d. S2 ^5 ?: ]6 q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
& ^  D) z3 N' H1 b3 b( O$ k        print_log(server, data, 64);0 I0 g5 k0 n8 K9 F' B! ~0 ?

2 `( g, w. u3 j% P9 m        //) K: K1 s- F: I4 ~( ?/ t
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) K. S! y1 u" r! S% M: ~/ H2 V% n) n
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! _7 y4 b# G8 Q; p/ i" }' t* o        print_log(server, upp_buffer_b, 64);# J" N0 s, _2 k- `

: ~, o/ Z/ C) F$ ?9 W        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; c. J6 Q$ ^, L, P
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
% o& T2 ]1 I. R+ a5 b3 S        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
6 T- ?! p3 Y8 }0 c        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& S+ t9 _# q9 ^+ @/ Q, G8 f; a% f" K4 @' J2 a; ?1 U
        memset(tmp, 0, sizeof(tmp));; ?1 L6 ?6 h4 x( w4 Q
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",   N# G1 U. z$ C& ?
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);, q" J7 s# {9 c- H; C, ~" {! o
        server_msg_send(server, APP_CMD_LOG, tmp);" c$ c8 g  c) j& D" d. i+ j
8 M# }! n( j+ }
        upp_error_count = 0;3 I$ r( t& c# y, E
        upp_dmaq_int_cut = 0;. j, H3 a3 A% |7 c& f
        // fill in data 8 ?% D4 c8 Q; Z& Y0 L& h
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); . [7 F$ V! l- g8 \& l5 B* p
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");" v! }0 H3 V# H# C

7 b9 G6 X( L! ^& A9 d4 V        // wait send success. l/ G3 t) Q- o4 [) ~( ~. |6 V9 I
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * U' T0 ~- P; Q3 P% C, k$ l

. N) i( B9 S" U/ b7 _        // make data node in free list
! G' @4 i/ f% z        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);4 s1 O* k2 u; ?. U, g9 a4 V1 t
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 F+ O. D8 \! G" M    }
. j4 J! T% i" G+ d7 C    return true;
, ]! C/ M% |& h/ D. O% H3 q}
4 `( Q. @, A( B, B3 d! q8 \. N5 _* e: h0 b2 Z2 [7 c* V) ^

5 f2 `* J9 C0 X: S( W
3 ?2 Y2 W2 ^1 k: H/ r% T/ k

  C  y6 }6 c9 D) v
7 Y9 u( h+ Q0 C! h- ]: [1 p8 V8 s

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐0 H# T* a3 f6 H" F& ^. G- s

  M% g! ]" q& [) O+ B; q3 D) _

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-26 09:56 , Processed in 0.043207 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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