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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # X2 r. b4 A) s. G0 j) i

% x: ~% R4 d( l: `' F# l# ~" B: C问题描述:
+ U6 ?" J! i* r1 K' w  @* Y0 E4 a在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:7 R' h' z" h. k: J$ l, {; _0 x

6 v. x+ U& ?& F! L图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
# j9 \5 P  \9 Q, Y) }$ u2 a
( q- U3 v9 y4 \  U$ d, T) W测试结果如下:0 J: i5 U3 \" O! `. O2 ]0 j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?9 y( p3 F" x) l  A" @" J( [
1 y/ h1 e4 g- {+ ]; a$ c+ o

/ W) Y0 g" a* g: M6 }5 ^备注:# _4 o7 d6 W7 q1 R0 R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* `  q2 _$ U' E' m8 q3 e7 ^
2、相关代码如下:; [% z% f( \% a  }+ i
//UPP DMA缓冲大小512字节
! O/ p  ~: N2 J% p& p#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  \9 N# F, e7 J8 |; U; b
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" ]' ]  f0 Q3 ]: s% f' i
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( e# V" M5 y4 ]- W" C0 `
) P* ]* F. R+ A2 y3 A' \' Z# C( @' ?9 d, c) K& O( L% x7 n* K8 K9 R
//upp接收、发送buffer* }; Q% ~: Z1 E9 b& R6 L% }( f+ ?
#pragma DATA_ALIGN(upp_buffer_a, 8)( t1 K) v+ f! H9 e  n
#pragma DATA_ALIGN(upp_buffer_b, 8)/ c8 ^1 }3 v- ^4 X, G
5 w( H% W$ E% Z( {) v8 S" K1 K
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
; x+ s1 h+ z6 A/ hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
' N5 H7 c, D0 \& V' e3 E* q
$ n( L7 v! z, `6 K$ ^) Q  M: v5 Z7 [( g
static bool server_upp_data_recv(Server *server)
# X. O- l6 E" D8 O3 E% D+ _" O{5 S# d/ [7 g* P8 O" B* r
    if(server->upp_channel_a_recv == false) {
* P# e) h. P" ~7 q4 j0 b        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
& K* A$ K+ T( D7 \' x        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
2 p4 c: w! _( u4 o* A+ t$ U            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
# L1 T" m3 O9 P0 n
' @' q4 P7 X/ H: T3 }9 ]0 F6 Q! w% r, `
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. x. g2 b. c* p2 M6 F
  I8 p) _) b% n/ ^8 S            server->upp_channel_a_recv = true;//
" J' c! p1 L1 k            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);6 c, @& F! D5 M; u
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;" k: l, j% x9 G( r7 F
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;0 {; r# U/ |2 m
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
( f+ r+ D4 E& s1 W0 n
/ A. O7 a: w: n. w+ o            upp_error_count = 0;
5 Y; {9 Z% l; Z8 n" z6 i! u6 B            upp_dmai_int_cut = 0;6 R; k, c* Y6 N7 B% s
$ t- a  S% e+ G/ z0 F$ N* ^, p4 l
            // fill in data
% m3 e1 J/ Q+ r5 @6 F+ F+ ?            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" c2 q4 u/ t$ P" u! S* a1 e- \9 O            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");2 w+ D9 O4 \8 o) O5 Z
        }
# F3 n+ K) e6 G    }, P- r  Q* H9 u& B* M7 t
    else{( U' i( s9 \  E; k! S6 U1 c+ ?: c
        if (upp_dmai_int_cut > 0){/ l3 ~. m& n$ P+ ~* A
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 r: ~2 P' P9 D! |+ p) b1 G
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);: b0 l- n1 A- R% c3 Y
) }- I2 K% U7 V' D

0 o2 P# ]6 C9 w8 h) U# K& L6 Z            //copy data to upp_recv_list_busy
% P& S8 j2 b/ q0 R& ~            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);4 y0 A9 C2 h/ H6 ?! H& ^# V' }

8 h/ l7 x1 F6 S) Q+ v            //
3 p3 Z$ Q! J8 h+ L' M            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  k" W& S1 j' b6 d. ?; c2 u

' i  c9 \. O, C0 u9 f- X* @0 j+ e            //
9 O7 I* @% G' i6 R# W            server->upp_channel_a_recv = false;//! S) J6 K/ U% d" U- v& l% `

. d( s8 u1 r/ Q" _. S            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- n. \5 S  Q! s. \* r        }. b% |: _4 h: h# A" s: ]
    }) J0 |/ r% X/ e( Z$ c- h
$ N$ z# j1 L" U' T+ P6 x  o

' V9 z% @* a% j% A$ [" ]! e    return true;' \! G, q. h9 T
}/ m3 J/ ]( k2 b) C3 c5 [! G: l

* p' @+ Z2 R  W1 d4 Nstatic bool server_upp_data_send(Server *server)
; v: f$ `% W! \. }{: T" _: @- Q! p% t7 V3 N
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' }1 t# w! x% j) C2 W$ C' D
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);4 ^1 l% N! M& Y3 P
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( l! L+ n! {6 M( o; b        char tmp[128] ={0};1 O( n. _9 y. S& V) J1 F! {
; M9 Z# `1 b+ ~4 y( z$ V
        server_msg_send(server, APP_CMD_LOG, "upp send: start");* D: \8 Q& |" m
        print_log(server, data, 64);% {' M( V3 K& v3 k) l5 n; l
# H' L' G$ @; I6 a; b, h  L! |
        //
- w. N0 e) t! |) b% [- N2 B( Z& O        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);- S& j% T# o9 u' k8 F$ \- t9 b
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& h+ K( D% X7 ]; c* E# L
        print_log(server, upp_buffer_b, 64);
* @' J: N' u' J* l" |) P( s9 Z8 h9 L
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);! h! M# P7 w$ }. r( i
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
& Y& s/ L- {: ^8 i/ d        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" F9 }; P4 p7 l6 p
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% @; g9 P9 J3 ]# U
4 N, ]- \% p: ?6 n/ ?6 v4 b" j5 U        memset(tmp, 0, sizeof(tmp));1 o9 B" ?; q. `. I! U* \
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
. }. d0 W8 E$ [1 D            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
9 g1 I: m2 p: U% e+ B3 t- [% i6 X% r; O        server_msg_send(server, APP_CMD_LOG, tmp);9 i% |$ c; t- [0 ~
4 U0 X* z5 I1 C5 {! Z& G6 G& a* k9 N
        upp_error_count = 0;; K5 A1 w, f8 Q' R  o9 \
        upp_dmaq_int_cut = 0;7 H. v3 e0 T1 r. O2 f
        // fill in data ) q. h6 m+ {- a, {
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); / K* `! R; O4 E* s5 ?$ [" E+ j3 p
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 p( w/ {# l$ j6 u. C3 y2 f5 m2 `* a; v) v
        // wait send success3 C* J) |! b) S  ~3 Y: [
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
5 R. b- I$ f3 v4 O* B) m7 n
6 d6 b/ J$ \+ J& t& p        // make data node in free list 5 @4 B: u0 ]% n2 t
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
/ j0 b0 Q* z1 h7 j+ f% Z        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& p  Y/ w: _  U, q/ B3 d* C    }
! g" }# F1 A. c% D8 q* Z    return true;2 _! M$ |) f+ w; O1 j
}! j* S- [( H) q8 V: {
8 i$ Y( |" h7 ~3 N/ m

" V  H3 \" Z) ^8 H- ?- B* |- d! V  b5 O  y

* I, N7 ~/ k' r& j' @' X+ {! f7 F

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
5 l5 C! G9 H' D: G7 }* X* \: e+ h1 g8 ]* g9 @, L& b

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-5 11:04 , Processed in 0.044784 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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