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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 a+ J. V" l% f; Q% O0 Z

7 o3 G& j3 a$ k6 X问题描述:
, r: m* Q$ f! ?3 r( P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:, M3 P, `& t/ M
# l# b. }- m9 v% V( Y0 C/ O# M
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 D. Y8 Z8 \9 i
4 t2 [* s' E7 \5 ~; [! P
测试结果如下:
1 k! l! e) I+ L1 R$ {; I+ y* g138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) D: F7 |4 d. v( f2 C( j, F! F7 f$ u
7 E& M+ e" L0 D1 C% }6 L, q
- H/ {2 a5 L+ d- c; C) R6 g备注:& S; K. ?2 g- j& p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
- m/ q) }3 v1 N, J3 }& v( f+ ]) {
2、相关代码如下:
. a5 q* I/ _, `//UPP DMA缓冲大小512字节' Q6 ^( U, ^' O" f: _: K
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 B0 x# N5 h( {9 Z0 @2 G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
# v' \7 o" b: t6 U* D#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 |( `# @0 d+ s4 x1 @5 V* B; t7 c6 g$ ?

6 T' x" H6 z. }' X$ ~//upp接收、发送buffer1 v6 h6 B6 ]2 \5 X# s
#pragma DATA_ALIGN(upp_buffer_a, 8)
0 l) [1 I* e; \7 }2 @#pragma DATA_ALIGN(upp_buffer_b, 8): Z- f1 u3 S7 E1 Q" O' @) n- m
) Z* P' K3 g: `3 I
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. ?& B. d1 \: @- ^5 Z( `unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];& I' l: e% J: x  X
! v: C9 Y# C+ V: _- g( s7 b. Q

; G5 q& `1 m( i' t6 J* [$ sstatic bool server_upp_data_recv(Server *server) ) _- c1 `, D3 G( M  e
{  c8 s( }4 Y  c2 R1 O; r
    if(server->upp_channel_a_recv == false) {4 a  e' K: e/ E! {0 D: h
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: Z$ T( y+ \: M( n
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) n0 R) V2 v' u& v( a  r) r8 J
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");0 f) d+ e* [9 o0 Z

' l: y9 e$ ~; v8 ^( a2 j
$ |/ ]' m% a7 f% I9 W            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, D# O* K& l% e) Q+ I8 J, y

& ]2 J# X2 y9 C+ v. c            server->upp_channel_a_recv = true;//
1 F) Z" y) `0 t: i) ]. V- G            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);, L1 \8 V. d" L$ v
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
& m* J3 ^* |. c, s% C! I; l4 c            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;) {  S* ^* n6 `1 m/ ?
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 O5 f$ `; \1 S# i5 H

& Z1 i3 z& O' T3 {4 ^: h2 x0 n; s# g            upp_error_count = 0;
5 P7 e1 y5 A6 k8 T, D0 B5 q            upp_dmai_int_cut = 0;7 T0 I3 p7 X+ c2 c! e1 M
. n: z" T5 j3 }3 I0 \4 {# P: L0 X
            // fill in data " W3 D$ b5 e0 t, j1 H& C7 v
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);! \/ I' ^( K: B4 D+ {
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
  R1 d! t+ d! E+ y        }
) y* L' Q( S0 c% L- |  `! \    }& T1 [2 I! Q( h2 k0 D) |& i
    else{# j- o5 b( ]4 K+ n  E
        if (upp_dmai_int_cut > 0){
; g+ {+ R( p4 d- t            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);& [; C. A; N; d. w$ o* ?8 S* }; F& t
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
" A3 C' u1 l) [- t7 J/ N+ K
, E  B6 l( D* e! l3 e: x( r& m& f8 q' ]
            //copy data to upp_recv_list_busy( w, w0 t9 g( X8 q1 c
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
+ w, _5 a. m" `3 v6 u
$ y8 l  D1 Y) Q" N4 {+ H            //& U7 [: a* Q6 }; Y3 I1 q+ A5 s
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  D* o( W% P& N
9 D3 `5 P, w( G
            //4 t" }# W$ X: V/ C# s% V5 L. }
            server->upp_channel_a_recv = false;//9 m, b  M4 F' y6 O/ v3 X6 b5 [- W
1 y- V2 w) Q9 G$ j4 G
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
, Z  F8 l9 y1 Y( r" w: C5 n$ E        }! ~( l- B9 ]- B2 M$ p  Y
    }
" i' E4 A2 Z6 C; G2 a: o2 ~
1 l( e% m; O/ u2 r
4 m+ h5 C) A% E+ T( l    return true;
( W: t& G7 h6 {2 g6 H" a}( b* X7 e' q3 e0 U) F  N

4 E8 u1 S) \8 c; Y# h6 M& ^1 e1 qstatic bool server_upp_data_send(Server *server)3 v' J' M' t2 V" V
{
3 [& Y5 c: U2 P    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" H6 F, A& X0 Q& W2 A        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! V0 P& d  m- M5 z
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" n* i- R  N4 T; y5 a
        char tmp[128] ={0};
5 q3 d: ?. Q9 d. r! |0 ?7 E) F* i: _! N. i2 z
        server_msg_send(server, APP_CMD_LOG, "upp send: start");3 i6 `0 |9 A$ J6 P6 f/ \% Q
        print_log(server, data, 64);
5 |+ c( t2 P9 O
; j  i8 m/ h$ L        //
4 U1 @8 P& b  z# J        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
% _5 l0 A' r  I8 _9 A0 ]9 A) Y- P        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ n6 e' b; A6 `. h" P6 w# S        print_log(server, upp_buffer_b, 64);
1 x! t5 `& y& J( `6 I' |' d$ |9 D7 M% X& h  g7 O$ Q6 b" \! q9 Z
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
7 ^3 s$ e; d1 _3 }9 o+ B( k        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) t9 d% `7 {) m! x
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" u+ g4 r* }7 T# t
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 G0 p) T, F' ]( |& U% ?, b/ j$ E" j3 l7 T; ^4 g5 B
        memset(tmp, 0, sizeof(tmp));
. C$ z0 C; F3 r; }" [7 l        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 7 e- B& Y+ x4 f# m5 j
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) k9 c2 M- d/ u( A: F        server_msg_send(server, APP_CMD_LOG, tmp);/ R+ d2 j. `% b; c
3 a1 s+ `& [) J+ g+ j0 ~
        upp_error_count = 0;
+ _5 l5 e& s( }$ h9 W5 [8 }        upp_dmaq_int_cut = 0;5 m% y" u7 [! s6 [
        // fill in data
4 P, N# `& |( c0 F9 A        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
: g  C" F/ C! W. X        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 o  |' e0 T2 L: T  k4 J$ q9 A
2 X" W, Z0 {" w, ^7 c; K        // wait send success
: f6 G6 \# V: k9 e8 a$ u5 ~+ {8 y, A        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
2 L8 [* d& X7 ?/ ^8 v2 ?" d
8 L1 d) I; a$ @2 S' v1 `        // make data node in free list
( b7 Z& D4 Z! C7 I7 p        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# B3 i5 {) t3 T6 E# q% v        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 H/ p! H' l8 l- `& B    }
- A6 A' \7 u4 F. E' ~: Z$ f    return true;
9 u8 L* ^* i) D/ ^}
+ p" ?  _* W, \& @) P0 S7 A: @. S6 ~2 u

6 n  m8 q: x* X
7 X3 h0 a3 {2 y/ m! L3 p
7 V. Z6 z+ v- c9 z6 p& ^  p9 M2 Q

# L2 t- _; Z+ _- D

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐) |. q: l3 s& a
/ `  ]+ o, b  D* }  Z1 a1 ]: l! I. ^

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 16:29 , Processed in 0.044910 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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