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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 / X, V2 t$ h9 [( ?
/ I) Q7 l) V2 p* i" f/ L! a
问题描述:& G, M9 B% F- o9 u' O  V* \8 R
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
+ Q1 g: u2 x! ?* f. i. v
% k  @; f+ u/ }- c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。" U! J' T+ c" w( N, _6 V& `3 g9 f: R, a

1 D+ q% Q/ a8 U$ |# j% }测试结果如下:
4 R/ D/ ~% k. Q: w138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?/ U9 n, Y( V0 g: n: y7 d5 B
. l4 t$ c- J! |4 S# a& Q0 h* u
% ]' s# _+ @8 t/ _: F
备注:
. ]7 Z% R- _2 f1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?9 \8 I9 B/ ~0 B, b" T2 I$ O4 X! p; H
2、相关代码如下:% g, g6 I8 l; D$ m) k
//UPP DMA缓冲大小512字节
6 V: O' x8 A( r$ a9 B#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 F, Z! a/ i* W9 F% j/ f4 ~6 C#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
- J: t: J) c4 w" M9 e#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 C3 W0 o% C( U+ l, F; N8 ^, q6 s: ]9 i

$ I' W; R% T1 U4 g' C( k, @. F//upp接收、发送buffer
8 G  ]) C0 |3 I! L% L' f! ~8 U% V9 g#pragma DATA_ALIGN(upp_buffer_a, 8)
3 l1 J+ \2 ^( T7 e3 t' P8 b#pragma DATA_ALIGN(upp_buffer_b, 8)% `8 O! ?3 @, G0 \' i# r

& d1 L  Z/ f7 T% cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];# V8 n5 \) b) @: q# C
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
4 w! ~: ^2 |" m, W" h4 r
! L# V7 c# E. c0 B& B
0 F( F- j* C+ d; p' X9 `static bool server_upp_data_recv(Server *server)
- C9 v9 a9 i; {0 e" f; g! F) U{, h, r' ], H6 X. T9 u3 [/ D) Z
    if(server->upp_channel_a_recv == false) {
1 O( a0 u; y% X( l+ d5 w        server_msg_send(server, APP_CMD_LOG, "upp recv: start");2 i; Q2 `8 j: h& Z- d# T" t3 v( Z
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
% e3 M. U0 H* q& ^/ W" l8 K% V            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");& N: u2 U7 A+ A" ], D

! Y- i  W2 J7 ?$ }, O
, B9 B1 j+ {8 u/ J+ f2 d            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% _6 b1 o0 T; K( T" z

* X, B  }! h. x! ]) R            server->upp_channel_a_recv = true;//$ H) j' }2 i# ~) H3 ~4 Y& N: j& e$ R
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
- f8 i9 Y& b: q: G; r            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
/ G& J/ S. v3 f+ U( q            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;/ R0 l. r9 a2 a
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- V, x, Z. Z& r, A5 \
4 O# R/ W% A3 |+ p- c$ B, J" o: Z" t            upp_error_count = 0;0 @! Z( R" j+ F5 ?# U4 F, Y- R
            upp_dmai_int_cut = 0;) N8 n$ d$ Z0 v8 i/ r# v
2 p# F% B+ ]1 ^2 h
            // fill in data 6 l0 O2 r" c4 s  u& x( T
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. u# ^" b. I/ z$ N: Z1 E
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 |3 p5 ]7 u& x6 Y
        }" r+ B+ m% o7 V5 ^
    }3 Y* a  v( }5 i6 ]! N, k
    else{+ P7 \+ \& D! {6 g- V
        if (upp_dmai_int_cut > 0){
) _: h: K! K- Q5 D8 j$ q            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);1 ?. O# n: x+ ^- N
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);$ R5 n; j- T3 o. o, r; G  G

9 R2 Z- C# {, Z3 o) b  ~- j$ V' T9 b
            //copy data to upp_recv_list_busy6 r: d0 T5 N: |7 ?0 T
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, w1 G, s! ~  w% K

$ S, `: I7 F: u' o8 N/ ^            //& D# r! |% f" |. b$ E
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
" z  S/ v) ~! W+ V, b/ Y8 k: C, i9 ]' H; K
            //( O8 D1 h9 _9 V( _) n
            server->upp_channel_a_recv = false;//
% l+ W3 B$ w4 E0 G: o* O/ l. F$ _. V! G: D
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 j+ @& s. H0 T5 B
        }& v9 s  U$ |& L' x6 m; G+ d0 x
    }# k' {8 i- ]- v% Y

7 e1 j' i* m; l& @& ~$ C
/ L' ^1 \9 t8 ]7 t    return true;- t7 T8 O( o0 [7 [: u( x
}# h$ ?5 @' j: y
0 g5 x% r0 g4 d6 _  _5 w
static bool server_upp_data_send(Server *server)8 J7 [% y: ~! u+ r4 _1 S
{) H; [9 F% U; E
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
  }4 x) x+ t. g; H0 ~+ u5 R5 o        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  e4 m2 N0 R; o) e9 [. G
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 B7 a: t/ o9 j9 K- g- j3 F        char tmp[128] ={0};, C7 ~) N4 ^, L+ Q& e

2 f* g/ B7 ~, Z1 g& W        server_msg_send(server, APP_CMD_LOG, "upp send: start");8 I# x/ d3 h7 Z0 x+ w1 c
        print_log(server, data, 64);
. e2 d5 V- o  n% I; u6 l7 Y! P3 V1 F
        //: |' U' o' t% d
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. v: J4 L+ t3 v' G; S        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);! K9 H4 d5 P& x' Q  [, ?
        print_log(server, upp_buffer_b, 64);9 R5 L5 g1 _$ u5 R6 F; a$ \& e

( O8 h  Q2 ]3 K        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);9 u4 P8 P% d4 g% u2 Z! B8 ~
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
2 R5 t# J$ P/ f  [+ _8 b        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;' ^. a( g& m% }: \; K# B& y
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. o' r9 {5 g9 P) G# Y3 Y) }; B( C& f& F) \
        memset(tmp, 0, sizeof(tmp));$ n- k% }8 }; H) |1 v) n
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", . P+ T* V! `+ k
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
  c: V: l" J2 q; O% G# X3 s        server_msg_send(server, APP_CMD_LOG, tmp);
1 `/ t) _0 F$ ]/ l+ R
2 x6 u; V$ ?% ?9 a2 F3 x        upp_error_count = 0;
7 ^; J# B4 C( ^        upp_dmaq_int_cut = 0;
  K  k+ B$ b5 O9 K        // fill in data
& v! \7 c$ R4 ]: B$ d  T$ P        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ l7 v: v* [1 U        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ m% ^6 `5 ^2 N. k) [! |
8 ~9 g& }. @% [
        // wait send success
9 g* M% k) L  f* {* w+ i' ]        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 H  z' _' y0 w& o0 c, ^9 o/ y" b; W, o: `% X8 u( \
        // make data node in free list
# {" p  a! B& j3 T3 I& p4 h# W        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 g+ F; b" p1 W7 x
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
1 k4 `8 Z( W, @4 v; G8 J# O    }. Y$ \* z2 ^/ s( {  _
    return true;
4 e; N! f- ?  L8 A}4 k7 m8 S( V1 I
0 d% j8 U* `' z* Y

! o0 e; t4 R: t4 f- w. N7 T
; ~2 o2 Z) a4 c/ X/ J3 b- }5 e1 o5 U8 D

  c7 G( `( |3 O2 h8 w/ U7 a. R9 k$ g: s. R: m( H  F- T2 g

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐1 _0 {, S; V. c1 I9 I0 u' I/ ?
9 W: v# C) r. A: M

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 12:17 , Processed in 0.043204 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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