138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ v( A: J$ ~( g/ M7 G3 z9 s  Z: C' N( r
问题描述:" o' t3 t' o6 f4 b( L/ _
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) ^8 s% {' ]* A( L" k

/ m4 @5 m. V4 B% `  B5 \图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) M2 m2 Y% K9 b' y4 G. g+ p+ E

4 p( J" h2 v8 k4 ]- W测试结果如下:
& R: m, B% f. q" F5 F5 r138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
6 w  p2 @9 |2 C0 A6 F6 h& B4 p3 z5 Z  F
' v8 d* l& v4 v7 ?6 L2 V* b
备注:
8 d5 a' y! |2 d" [5 L8 d+ |$ E" Y, `1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 o2 D/ Q6 Z. ~& P7 V
2、相关代码如下:
; @* a* a: |4 X8 a3 @//UPP DMA缓冲大小512字节) q3 C2 ^7 U* l# E& _
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
+ n& ^$ C; O" H* A3 ?8 \' h/ J; Z& b: n#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT' u& F( R3 G- X1 p: w, K4 \
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& b+ E- \2 ~+ B; Q, n% v( Y1 T6 W8 Q2 d( x: f
" L/ w; [& f' O8 w
//upp接收、发送buffer
$ ]' L& [* j) c- f$ m) o# G! E7 L#pragma DATA_ALIGN(upp_buffer_a, 8)
% t: Y1 A, v! \' v9 L#pragma DATA_ALIGN(upp_buffer_b, 8)! D/ I; O2 P; W8 [

4 C: R4 {0 p: V4 X' U  Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! H) w1 Q& u8 d! l
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 k. U0 P9 B( H: [' ^
3 `3 S; i6 R. B. f/ ]2 D0 i1 t2 r6 P8 D, C( @
static bool server_upp_data_recv(Server *server)
  E5 a. x# X* y. ]3 g3 N8 s) }{
5 V/ G& m4 W9 q) A2 o) s    if(server->upp_channel_a_recv == false) {
+ T; J2 R! }) {7 N( K, \& S        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 R6 d( E- V+ {- \$ m* y        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 t/ _" W' [+ x5 X; W, n/ S            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 W9 T  d0 c- l% D5 E
; l9 V) z. a) W' b5 c1 ~+ ^' q* U" z5 V! D, q' ~% u4 ~
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ P+ r3 \/ l5 f) {

8 A% _/ g6 e- u  F2 Q2 E! [            server->upp_channel_a_recv = true;//  @+ G0 o5 s& F+ K% H0 g
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
) R+ \; ^0 E3 L0 d' i            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
% ?' G; R" Q: a. @# u            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 |7 k$ X+ X) ~: R
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
+ P! x& X6 W' |* y1 l) H8 ^% E& f+ h7 n9 S$ Y' N- B5 B
            upp_error_count = 0;
2 P/ N* n, R- F0 o, {7 M0 W0 T: X            upp_dmai_int_cut = 0;& l$ z4 l" G; X9 l* P
) `- B% @. ^5 z, }8 d
            // fill in data
9 T. p4 O5 v" X8 Y            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 P/ e3 S9 R. T5 U  ~& n5 c1 r1 q# j+ O
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& C7 m% a9 H' b1 F4 o0 u        }
% j2 O* p( F5 G, N, M. P  B) U    }
( V* Z+ u' y, V' Q: E    else{
! }2 F0 q% B/ ?        if (upp_dmai_int_cut > 0){" t( [  }0 T' _1 m  S
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);+ [: p+ r7 n% P3 D
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);  ]! b- b: p4 F2 l
3 m5 R2 a" ?* L8 q" i/ y
) c( @3 j- t1 E+ O5 j
            //copy data to upp_recv_list_busy
' |# o" Q. E$ s! B2 `            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);* f! D3 E( e  Q' Z# y/ v

: ?7 L% u% x9 j            //5 }9 V  }, O/ {* ?, D
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
% R& ]# m3 B$ V3 i2 s4 L: M+ w* x' e
            //7 ^3 U9 M& r0 d8 u& Q. `+ v
            server->upp_channel_a_recv = false;//
1 K9 \. s) H) |; y9 I0 w/ w" }5 I) e, Y  _
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");( i9 T1 \. G" Z7 L: N
        }! F2 y% G. _) @5 p; R& P/ }
    }" e/ j3 t  g6 b0 y
+ N9 q6 e1 W9 v; l/ k
$ b6 B9 ^7 {. [0 q3 x! t
    return true;
  @( `# U( d, P. F}& K# \+ A1 S$ z
& i3 }. N& ?8 y7 u
static bool server_upp_data_send(Server *server)
0 y4 D# I/ J2 }9 R  J{, T1 `% R6 @5 Y, f% ?
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
# n  \6 t" ~9 i7 _0 O        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  \! [2 z6 J- f; ?
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 |7 s2 G3 C8 [' K7 W7 z. ?        char tmp[128] ={0};" W( z8 Q) _( b" W* \
" l. Z% Q# J/ T9 {& _
        server_msg_send(server, APP_CMD_LOG, "upp send: start");% q- N, N1 ?" n) s+ i& T; e
        print_log(server, data, 64);5 S+ v; _" w# K$ H
! N' d7 h: G$ |$ D# \9 |
        //
1 h! a0 \( y' O, E9 @3 i5 e        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
  b$ b2 r: S2 _        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);1 b0 @; Z5 [3 N& P0 o
        print_log(server, upp_buffer_b, 64);3 p; i, C# y' ~

: V, M8 J6 U& T1 d/ A8 _0 K, @! I        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);1 j' G4 ]$ Z3 p. b9 O
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
5 \7 \- w0 C; }# F        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
( P6 n8 u. E& e! {        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 G# A! B# r  F% j/ n/ [( B6 w) H! t9 @9 H
        memset(tmp, 0, sizeof(tmp));( ^" G: j- V9 A! I" N
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - G1 y3 t7 c; _
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);" p, s! c7 M; \7 n
        server_msg_send(server, APP_CMD_LOG, tmp);
. j$ h9 b: ^& h5 H* B4 t. f1 d1 a# M/ n# C
        upp_error_count = 0;+ K7 w# R; H  {
        upp_dmaq_int_cut = 0;/ ]3 [/ {6 R6 [0 |4 y
        // fill in data
. |4 U! l0 {( k5 ]) S; P  z        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # t! \! K% P* y1 O* B/ F
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 b6 w2 W  u1 B# Q) v: @
! `+ t  z7 }' S; g$ }( K# o/ S7 R" @
        // wait send success; S1 N4 A2 w9 n/ r" D2 V
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);   y$ W4 E4 l* w( ^7 t$ l

( _( p4 G7 V& }/ O% t        // make data node in free list - t) {* n+ U7 Y$ L  b! I6 o' c
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);- {# D2 i% P; @2 t  A- m
        server_msg_send(server, APP_CMD_LOG, "upp send: success");9 h2 R- A! H" A
    }3 y- y  ^0 s5 u; v. G/ ~1 k
    return true;& E  \+ l" I" t. t
}* N3 ~5 L  `2 C# j6 u  R
0 d; z; _. g7 d# e+ X% \

8 Z4 \* T% L$ g, O, n% i( w& S  y- y( g7 F. o% V

& y: A6 w* B2 b3 l% _/ M# v9 n' D  k5 t2 \% ^! w& B

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* c8 c& x8 i& }- B3 y; n6 f0 P
/ i" J, a0 ]0 u5 S* Y& n  e& t

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 19:35 , Processed in 0.041091 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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