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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & r, E- [- z( |( i5 p, \4 e* f

$ i; m$ ]/ g' z% ~$ U3 L9 A问题描述:
" T" I4 @$ d6 L在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 b* E* r% n0 n/ s5 f/ |! b
0 ?, P7 |. @% R8 M0 G. [- U  U
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! \2 r& Y( k# S/ `% L
4 Y( H+ |( c$ Z* c, J7 k% L6 ]测试结果如下:2 R" `; [) y' i# S, d- o9 m6 R/ ^. l
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 [% b, ]- G9 ~3 H9 h) z$ U7 F# w% E- T

8 {. H8 s1 k( N) x. B. H3 P" o" H% D: G& S) J1 @
备注:1 Y8 p; ]# U7 M4 _. c: B, G# B
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
$ P5 T" w5 ]* t, U8 i# m! u9 \/ D
2、相关代码如下:
1 t3 f$ v$ ]1 R9 O//UPP DMA缓冲大小512字节
# J" {: c8 `7 N#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍" w$ L6 M$ L9 n4 Z. B4 j! W* |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT; U/ S1 h5 `$ d  [; r
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)0 A/ O2 E$ y# n7 C
1 Z0 |1 a" f4 \, s0 ^7 ^- t: X0 R2 e
% z; e9 r3 w) P2 [0 m1 U4 [! E
//upp接收、发送buffer
5 ^8 f1 b6 j) V6 E2 z" N( r#pragma DATA_ALIGN(upp_buffer_a, 8)8 Q9 V" f7 \, {0 L: z+ R5 T2 k
#pragma DATA_ALIGN(upp_buffer_b, 8)7 m3 ?5 Q, h; j4 Y5 g# a* R) D# @- J

& H$ R$ G5 m/ a  C% [1 y' e# [9 J. Punsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 q4 Z" j" e5 `. I0 r5 runsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];5 r0 O* _9 Y4 `& x* r+ I$ B! S

8 L/ i6 ^# [$ _( f4 u! L5 T+ M" }) {% }, O9 A+ Z9 V3 @& V
static bool server_upp_data_recv(Server *server) 4 |, g! w0 R: \: X8 e$ X
{3 I+ A) o" f3 X
    if(server->upp_channel_a_recv == false) {
* Z) C3 |! V/ ]" G        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ C# m% w5 F3 V* A. v! u0 q        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
: X4 h3 I) y4 O: Z8 f9 X) X            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- l/ B$ {2 I- X2 d

5 Y- N! Z7 G4 ?/ O! _/ j* X7 p4 @: P$ c, D
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. _+ f! z( @. `# d9 n2 A/ ?4 L# ]( o- l& g; _7 [- [
            server->upp_channel_a_recv = true;//* |( s" N% Y" b" `" z1 g& }
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);( p/ ~' q2 b# c' [; P
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  C( |, f) t' c7 h7 L- V            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;# ~  o9 g! i2 c4 U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//! z; `8 F' p+ [, R/ }! i

* p% J) o& k& n; h6 y6 q8 B/ N! h            upp_error_count = 0;. f1 W3 o  u4 [% O; n
            upp_dmai_int_cut = 0;
6 `/ ?% C& m. q- R9 ]* k( w( ~  w4 I' M( C- v
            // fill in data
8 q$ Z2 O7 O. T" v            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
9 ]- g! W% Z; q3 D, E* O            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
  s7 Y1 }: U  Z' V0 s+ K        }& _  i2 z. o! |% u9 w8 ~2 g. S& h
    }9 @; s8 ~. v$ l& d$ H7 H$ ]
    else{- i% n# c/ Z/ x3 [/ x+ N; n
        if (upp_dmai_int_cut > 0){
8 ]$ I$ t& ~' [& n6 e7 e            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
  B% T/ Q' R1 G" t7 M" T            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);  |; A8 N! E: C1 u
4 M* F" @6 s4 Q: F9 Y% @' W0 X# H
& v/ Q! O' @# a& R0 f4 d) Y
            //copy data to upp_recv_list_busy2 r! O$ [7 w9 O! ^. V  d
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
6 J& s3 P1 Q- R. ~/ j/ z
0 j8 ]& Z7 m8 q: ?5 g/ g            //% w7 e; [' l6 t& m( j0 Z
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
; ]% l; C" O6 ]% N1 y4 {: s# |4 Q1 ^" M6 g! @- M1 y
            //
0 F1 H% r! @/ q            server->upp_channel_a_recv = false;//! H+ f1 L$ V: h0 a( w
- P& W$ D/ Y5 P9 T% R9 ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 G; J+ Q7 C4 P% B' K+ }
        }
  p5 w' n" ?( F" s  p7 i( d    }
) A1 a- ]* _2 t. a3 |
" b7 ?7 a, M! E
/ O: F: I' r$ p4 t/ Z    return true;
" G; @7 p9 P/ l0 H1 W4 I}
! a8 P' J6 |# M. b- w: S" f8 s2 [, X5 [2 Q$ E5 N
static bool server_upp_data_send(Server *server). E# l% K1 n' S: p6 y
{
: ?0 Y7 \  {7 Z0 B1 H# U    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 w5 i' ~: h$ x0 E' I        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
; Y2 a8 g+ W+ l8 h' x        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ d' g& k0 m* W$ u6 F
        char tmp[128] ={0};
) ~& S. p9 @1 _, I' \4 |/ G
# M5 P& q8 M5 A" |" f; t! f        server_msg_send(server, APP_CMD_LOG, "upp send: start");) E9 j1 j( t0 t
        print_log(server, data, 64);
0 D: `' |7 g, Q1 g. l, ~# C" Z: S& v" {0 N( Q
        //
: c2 ?$ S' R  _% M1 K        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ \# M1 s. F6 y8 ^0 Y$ {
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
. h* w. V& X2 B        print_log(server, upp_buffer_b, 64);
* Z0 M: [0 S' E- C" Y; ]% H1 ]/ n, q) A, N" l) p: Z
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);4 Y* ]  m5 S! @3 |
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; - R+ Y# D# p% R0 w
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 Y5 P% Z5 ^) @! h- m0 A        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ R( E2 B$ @# l% L% K+ Q

, e5 p6 \% g/ ~) W        memset(tmp, 0, sizeof(tmp));! V5 E  c& C( R* ~" M# P, _, u
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & d, Q- N7 E) X- _/ z. T
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( l) ?, R) p9 [! m0 B' y! N& `        server_msg_send(server, APP_CMD_LOG, tmp);
* A3 }8 Y7 ~+ r# s& ?0 J
# w) ]( n2 O9 _- U        upp_error_count = 0;
" I3 S' Q6 S  {. M        upp_dmaq_int_cut = 0;+ A/ ?  d! k* h0 Q/ g
        // fill in data " r; b5 Z* y! s
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 4 x* q( M+ I9 I1 L6 l
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# ]$ Z- p" {& W

& ?' ?5 s2 |7 n4 O8 R        // wait send success7 z* N# x1 a* Z
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); " N6 H, \2 m% S" E6 D# F/ I
) |( S+ q$ {& c& o% g
        // make data node in free list , B+ X7 A' X1 L- o3 Y# l
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ D' y2 k: `8 x( f( I- b        server_msg_send(server, APP_CMD_LOG, "upp send: success");
, V5 H/ d' d' @. P( x; d% ~4 {    }! X& D; ^2 W: F- G# e
    return true;
( K* ?1 ^6 C# u( k+ K. j- g}
* G8 o& q6 D- R/ Q' L1 H# d4 {, b, ^, O
+ l# [+ ^+ n. ^' }2 z% T

* U, Y7 Y/ ^$ H8 m: j
  y9 p9 Q0 n7 S+ O/ l# Q
2 {0 h2 y! W$ |$ y

  D5 f* d- [% P/ v# B! o% T9 [

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
6 {# I( o, h' N  O+ D6 V1 R7 n' R( `" D( j+ f- ?8 `# s8 m

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-23 02:32 , Processed in 0.041318 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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