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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! d& E6 @6 F3 w: ]

/ T- D  i$ r3 E* B. r+ |$ A# y问题描述:
6 t; I% v$ }. b" c9 c在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 f2 S+ i' p: K* w, }( t; c3 n" z3 u6 n. j# j( k+ z  I7 S: K
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。9 h$ |/ i) v+ @) z
$ h# b2 L- ~# b; `$ E
测试结果如下:" k. {* e; I1 Z* g' V' ]
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
5 O# x  p4 ^+ D# D0 Y  E7 l* v9 m2 c2 J  Y8 C" c

( M! D: K8 }& ~+ I# u* K备注:
' g6 V  I* @" Y: T! L1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?) p$ d4 e: d, t" y& V" r
2、相关代码如下:* d) ?8 R! E( S# g
//UPP DMA缓冲大小512字节8 Z; K) _: g- S3 o
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; R. X- x9 I: _* M- U( A" A
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT, ]& N3 N- o* h& H( k, I  S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
' ?& _8 r/ u% B6 p
" ^8 }" x0 w! h+ }6 {* b3 I8 N: P0 c! z" ^8 P7 [- |
//upp接收、发送buffer7 o: W% `' O1 x; h' J, {: b+ U
#pragma DATA_ALIGN(upp_buffer_a, 8)& {9 d. a3 D: y( w! c/ x5 a
#pragma DATA_ALIGN(upp_buffer_b, 8)" E3 r$ L2 D# c1 e

0 |( X/ t* ~8 r4 K% Wunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 n/ h/ v/ y& p1 f% hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& n- g  d# G/ i0 X
$ T. B4 }7 a) {0 Z# c+ h* r$ Q6 e
- Y$ H* H. [; N! U' T' @
static bool server_upp_data_recv(Server *server) ( W% R* K* \9 B1 m4 b2 p4 f
{
; d) _( \& e) i9 j    if(server->upp_channel_a_recv == false) {
# K7 K. w2 p& m. ]) T% f' r" z        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
# Y8 A  f  o3 C        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
8 V: `5 X" f5 B: N/ s" t            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
9 H+ ?8 {: b6 ~) y* h# |" f0 F9 P$ |' |/ ], y/ k; p/ V

- K5 B$ E6 g; E( v+ m2 F; f            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);1 n) n  J6 D( n6 `

+ M4 b8 h6 h% k            server->upp_channel_a_recv = true;//4 Z. w) H  |/ A3 d- _% W1 v
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
5 z' E% E- p  X            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;( O% P0 q- L7 M0 ^# K4 a1 E
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
9 l- D, V3 w7 C# {            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
6 G& T( Z7 d$ B( r# U: a1 j
6 P; k  c' b* z8 @            upp_error_count = 0;
/ S* Z: D' a; T8 Z: D: e            upp_dmai_int_cut = 0;3 A9 @) e$ K; u4 v( K
+ Q% U5 U6 M- j) [
            // fill in data
$ j0 F( r0 I$ j            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);9 H& K- w! z- t
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( M7 w3 Q7 v3 H5 }/ s+ \: \$ _8 P        }/ R9 g9 H2 m+ [+ E4 E; @& S
    }; e0 s! e$ |  B0 Z: V* D. V/ f' p
    else{
4 L" Y% s  I# r6 {; }; w  n        if (upp_dmai_int_cut > 0){, z7 O& W% {& B0 \& i( C
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);3 k7 R- c! f, q) d; _( I* h% @
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);5 f2 g+ u! `! W, A+ X
: @8 a7 L) b* d) }9 h( F2 C
. X; j7 Z! x; T7 `+ p# w
            //copy data to upp_recv_list_busy# f$ V0 k4 c. I, w# f
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& C9 [7 w+ U; @) R& H
4 y6 E! ~* f2 b' h  e. n            //
* h/ |& ^. y- S            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# m( v$ }* |. N. i4 J

) d/ }8 k0 ~$ t$ l6 H            //
& k8 g, [4 D% v- z            server->upp_channel_a_recv = false;//
& F, k6 K- ~7 i0 n, F5 H& r
# s/ y4 i: L* C3 C! s0 v  E            server_msg_send(server, APP_CMD_LOG, "upp recv: success");0 e# c2 p4 q& O& s2 o
        }2 K* W0 j$ h" h  c4 I  D
    }
. \* l9 j: M% U0 A2 |: [
$ S( {5 `' G% h* _- y. m5 H, W& F5 h7 ~/ s+ r+ @
    return true;
* R+ P# r$ I1 `) p# i2 ]9 Z}. o, _/ N2 V! j# q
$ W4 o; Q$ L- \: a
static bool server_upp_data_send(Server *server)" u& i- {1 [# d9 S* s( y8 T
{
8 @) x, x* G' p3 ~    if(ListMP_empty(server->upp_send_list_busy) == FALSE){8 Q2 O' h, _7 v# \; J1 D$ O
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ n3 I* |: E7 Q4 z0 S
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);9 Q7 U( ^7 w. I1 [4 d! I  ^
        char tmp[128] ={0};  f5 f+ Y7 ]3 u7 I

9 B$ P: C* d7 K% E/ _- @2 N        server_msg_send(server, APP_CMD_LOG, "upp send: start");
2 Z9 A, L$ H, D/ o9 ^( L2 v7 f        print_log(server, data, 64);
, Q- h9 e) u$ B1 D& K* Y- a( M! |, R) S2 p' X7 N* H. L
        //+ {9 \; f! D9 w# p% R. m
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);8 S! h' v9 f  |$ ^, A
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);3 J) N- T4 {/ }/ I. {
        print_log(server, upp_buffer_b, 64);. T. E2 I/ B& H
! R# b2 U- o/ @; q' i
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
6 s, a5 h3 Z- y4 s/ C) W! z" R5 D        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
' B4 `, N$ q7 x        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;/ B- n6 ?1 L4 }0 ^+ D8 J
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) i/ w, x# g; \- k& i$ J. l0 H* X4 c" D' T
        memset(tmp, 0, sizeof(tmp));
4 b# B: U$ _5 x3 S: k) C        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
/ y6 l! s0 E" ~. ?& x            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
2 F0 K& o) e. k        server_msg_send(server, APP_CMD_LOG, tmp);0 E( i; G/ o- `5 S/ f: V6 _! S
( b2 }6 w: ~- j0 X1 f
        upp_error_count = 0;
" j1 h+ P* q* H' v1 ~        upp_dmaq_int_cut = 0;9 o  b, S" A; \4 |2 a
        // fill in data 8 d; s2 C8 h$ R6 ~: b, f( e- q
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 x3 b5 m7 J2 N! S8 ]- a
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
/ [+ T8 U2 N1 ^0 ?* P' p  p, j* E" q8 \: G' ~
        // wait send success
' p4 |& X5 I& o" }% K2 Y: N) v6 d        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 9 w! e8 L' M8 p

  a! x1 T/ J7 V' O) k, z1 d        // make data node in free list 0 w* I6 C& a/ m8 O6 r
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
. M' {$ J. ~/ d! k) y  Q  @4 q) y        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 B* \4 z  n3 d) P7 S; o
    }6 Q& h# D- R' {8 J, J
    return true;. M- x  |8 _: c
}2 c2 f5 G& ]$ l: J+ M# v/ @( C+ t4 T

9 Y, Z' \# z( B# X

2 G, r' m3 h( a6 X, y' R! Q
- Q1 B% M7 F% V1 o
5 P' e3 [6 H- W4 t$ ^) T  D

4 F& Y* \/ ^$ h  Y/ `

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐3 O8 s# ]' i8 G) E, d1 O

6 P- ?7 b! K" w" [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 21:26 , Processed in 0.044767 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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