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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 8 I/ o" V) i6 b9 D" l% N

. p2 t9 G" l  s; E) H" X问题描述:
6 C8 `0 {* T0 a' T. s在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ F1 ^# H8 t% O* R+ q. J' ^

, F4 S+ _  I0 g7 u. f7 q  L图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。5 J" A+ F7 G6 W- n
6 }2 s! D7 H$ V. p# V
测试结果如下:
5 P. A8 U. U! u" Z& O138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
: f6 W. O3 S5 j6 _# ~) E2 s; A
# M3 ~+ P$ [9 S' y% i8 b3 `
1 |* F( i3 h) B备注:
  t; S7 }9 \5 u0 [/ V! O0 X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?- H7 x- S7 K% b: z6 I/ Z+ _% f) d" s" Z
2、相关代码如下:
# }7 m4 `7 N7 T  d8 t//UPP DMA缓冲大小512字节
1 i) M  w* @7 Y( U$ @( X3 g. }, R#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 L: U* j3 y0 T! I+ ]( S#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT8 ^7 y+ Z; n- ^
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
1 C1 w( E2 E& W) @: Q' t8 A. M/ _6 N  ]' [/ c
/ H5 Q5 F4 ^3 Y' B6 _- V
//upp接收、发送buffer
4 o6 b# b4 e' \$ [4 I) [' y#pragma DATA_ALIGN(upp_buffer_a, 8)5 ^8 g& `4 C9 `2 M/ a5 k
#pragma DATA_ALIGN(upp_buffer_b, 8)
( ~5 |3 q  L+ t. Q/ X/ g; g# m: Y/ X: G6 @; Y8 \* O& ~6 Y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
0 o2 I( g* `" g  ?6 Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 B' C! n5 P- R. G8 _
- D" w/ H* u! |# |( w. M2 _8 w5 R4 L: q  A
static bool server_upp_data_recv(Server *server)
  f) q1 h4 ]1 d9 |9 _/ v7 ?, ~{$ v% A9 K8 t# w9 |$ l) k: b6 x' _# D) r
    if(server->upp_channel_a_recv == false) {& ?; J$ q  ]2 i3 K6 X/ ?
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");6 p$ ~$ [/ M  a* T" m& ^
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 v* ^6 a2 l) v# V* D            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");4 h/ a, u0 o+ n+ M# u
' \2 a: G0 ^! t( x: U) U1 f9 D% i
) y3 W' M' Z' O
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 m, h, _! _' D9 B8 L

! u9 ^- n8 D/ E2 N: d( d            server->upp_channel_a_recv = true;//) m: c. G/ N# ?# C
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! ?' r; |3 B  }8 ?, }5 B* ~            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;5 X8 R7 K. A5 P0 h1 A' N3 ?
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. o: R+ f/ k9 H2 n8 w2 Q            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//. R  n* d; T" u, R. }6 R2 H) q

! p3 O: e7 A6 \            upp_error_count = 0;
- g& {) m5 Y; o) {: v            upp_dmai_int_cut = 0;' f4 |9 i2 ?, M9 n* W) N+ ?& o

! }$ X- W6 f( @  Q  ~. T7 O            // fill in data + D# G9 B; a6 p! L; _0 v
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);6 Y& L9 d8 Y( G0 k& B( Z
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
) k7 N" d4 T3 C( I8 o% n$ P3 M        }5 }3 v! f8 `1 v
    }: O; W% [' k$ m+ Q2 |
    else{8 q$ n+ v  h7 U; D: P
        if (upp_dmai_int_cut > 0){
& `0 V% V  _- [3 [5 h5 W            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" p3 x; {5 v, }& I) t- _, E; Z9 b7 B8 w
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, `3 \8 B" k: K5 m; _# w0 m+ k
. \3 @1 _, w: l* Y; M8 A9 g" E8 w2 H/ z9 }- I2 `5 m. W1 a5 P
            //copy data to upp_recv_list_busy% k; [9 {" S9 S# M1 ]
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
; n- V0 w: m1 L+ [
6 _& o& z7 H( J, M- A* y            //
: p- W, ?  v! I. N/ {2 e7 ]; y            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);. O+ M: B) W1 m, W8 m# a7 K

( k' q5 Q" ]6 N7 ?! p0 |1 w6 }5 E            //
2 h. b. z+ C0 R1 j6 k            server->upp_channel_a_recv = false;//, |' k1 b; q$ \9 _

& n1 x/ d0 J8 t: ]9 L            server_msg_send(server, APP_CMD_LOG, "upp recv: success");: g8 m; a5 M2 h$ ~+ t$ e
        }: J7 k, b- G% z. F9 d5 _4 ~8 ?
    }
1 n' K% r* n1 ]( W, P% n+ j, j9 H% X( O5 C% |* U- r
% {  |$ Q9 U" g2 N4 D" O
    return true;
( p! U, [$ ^4 C+ B- i% p}" \2 M: k0 F4 Q# E1 S; @
; V  Z( r5 C3 X' ?
static bool server_upp_data_send(Server *server)
6 n( a! o1 t  z# m{- n) j7 d! E' a! f
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
2 D# X- y+ @4 P        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);6 B! L6 ?3 V8 V9 ?) k
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
0 y7 r9 ?4 {5 h3 R2 [        char tmp[128] ={0};
& v+ |9 l* `  q( j) g
% _. f1 E  }  }. F1 t        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 E! }4 S: P; g* l, h8 e
        print_log(server, data, 64);
. l+ R% I' _& P2 b& v% c2 {) u$ R- K' u: R
        //
, d/ P, V" t+ l; N% j        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);% [1 x2 l  ^6 U5 g1 E9 V
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! H6 A3 {1 _+ @8 Q( h) G, f% J        print_log(server, upp_buffer_b, 64);- O: m7 {0 R1 n/ w9 g/ f; x. E

+ G( b; A* i7 \( n7 h        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
9 s6 |) j. x3 X. ^        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) T2 y) m8 x9 @: L
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 W& W% |! q# ?, I2 v- `        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
) J+ \4 J$ j" H# W% {* |. I8 l  G2 G2 w' @
        memset(tmp, 0, sizeof(tmp));
$ x! D% X& H+ F9 d" X- r        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' V6 \7 U: l+ R
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);5 m4 M. G4 l$ t% [
        server_msg_send(server, APP_CMD_LOG, tmp);+ x9 B2 d! B9 K) Y) {9 w( U
5 t1 X& G% |2 r7 C; x
        upp_error_count = 0;+ _: `2 Y! w. {5 ~) d' w# X4 m
        upp_dmaq_int_cut = 0;
. N3 w  c! x3 O! L! @" ]5 R        // fill in data
" ~6 ?# _% o: {3 t" J3 Q& h) ~3 b        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) g& n+ \+ y7 w: M" l
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");, u+ `1 m0 E3 _& T9 k# G8 V

8 d# ^; f3 f% p) F% J& |! v# x        // wait send success: }$ d. U6 [3 \1 M  t: b
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); : a0 M2 f- U4 v3 K0 Z* Q
; J2 S. B3 _& E1 j4 r2 i
        // make data node in free list
# j' ]/ i+ b( Y' S) o1 S) Y. s        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' {0 o/ a* n. G) J( Z5 w6 h+ K        server_msg_send(server, APP_CMD_LOG, "upp send: success");3 t, o; Y8 n- O* f, @3 R6 d
    }; s3 Q. V% b  i- u2 B
    return true;
! X* g8 W' s9 f* U: [/ e}
/ q, u9 j# }# q0 ], w- J. v. W, k6 h+ D1 i) g' I9 j

; i( L1 |4 P9 @6 J0 }8 \6 T" r$ J% n; I/ K- s/ D

/ q3 s3 D8 _7 l3 w' p" D
& y4 J- f! J* P$ Q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ s6 B0 |+ ~6 R5 c% M) t& J

; @7 ~4 F& {$ @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 23:46 , Processed in 0.038367 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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