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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 u9 f, O$ d; k; J5 W3 l- _
3 e7 ^3 V9 f3 r/ i# {
问题描述:
# f6 K8 k; I! O7 A; U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:) ]8 N/ N' K4 ^2 X  E& S; t
2 w2 [8 l7 i( i8 C' i7 {3 q( n
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
" h, R% N( Q; q: l
3 X& q! P3 j$ J5 x( \测试结果如下:4 G9 V: O  j( e9 j$ g/ O
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
# U9 \' q3 n: l' A, p2 q
6 V  G( U, J7 l" Z# [/ h5 `, q6 a% @+ d/ t
备注:
3 ^8 j# Q; P; y$ Y6 `" \1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?' O9 j4 H" \; t5 c% N! J1 |
2、相关代码如下:
& f) o1 O# I8 ]# _! B//UPP DMA缓冲大小512字节! h9 }; k0 n( r0 D* P; H5 Q( t0 W0 }/ v! r
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍0 V; Q$ V; d9 ^+ g! w3 n
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" x  w$ b: y* M, m+ N# @1 y, S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT), L0 O( }# }- y* e& s5 r7 x. l
, U- x  o, d" h( x
/ v* h  G, y5 E
//upp接收、发送buffer
9 h' D9 z3 V2 ^, j/ }5 r#pragma DATA_ALIGN(upp_buffer_a, 8), i4 e1 Z* T$ B& R: _+ w. Y% u
#pragma DATA_ALIGN(upp_buffer_b, 8)
3 t  }+ |$ b' D, I
1 T4 t" w9 u* A) F# Funsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" \1 s! l  _0 D8 }  q7 A5 {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: y6 d" V) ]( f2 P

4 Q  }: }$ A6 Z1 j  z! j& z/ f: @1 x, s- {
static bool server_upp_data_recv(Server *server)
1 X0 p- R, n% T: o{
6 |8 o! V' p2 ^3 F9 r2 q, A  \/ Z    if(server->upp_channel_a_recv == false) {
( Q4 h4 ]+ @6 B, V. t        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* Z, D& c) u' [
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
$ A& @, _3 ?4 _0 d' n/ f% N            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
: t$ D0 ]  ]9 B+ s0 d" \8 ~$ D5 z5 ~: z. |) B+ R3 ~0 e2 \! C. i- [
$ C8 B- x' K5 {1 N9 v, e: @* a" g: v
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* S) y+ E6 n/ ~- n
8 e# c. h4 v! A# r4 m; g            server->upp_channel_a_recv = true;//
5 W2 |" b% x% Z6 G% i            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! ~/ t- V$ b% }2 f            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;, N7 x7 r! v* ?  |1 S* Z" f8 @
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 z! m5 z' z9 q6 d5 ?  U, G9 \- Q
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 s  J( C, w) e( n! L

' S3 S% f* t" ^( c: Q            upp_error_count = 0;( C$ t6 G8 O; Z
            upp_dmai_int_cut = 0;$ Q1 U4 f! d% H/ \+ F
- e* Z# K. K: B% ~% V. d
            // fill in data
# O( \- X/ }# O* @            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- d3 C; K/ `% i
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
# A  D5 u, g2 R6 Z        }
! W& j! U3 J3 O  L) f9 H, c    }5 W( @5 ^4 A! k7 E, N6 u
    else{$ I' i2 [4 g, |9 j
        if (upp_dmai_int_cut > 0){
/ a) `% F0 i' r: h0 I8 G% A2 c3 g& D; U            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);0 }, x7 j. K1 n, K' R# E7 f( V
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
& d" q6 _4 D+ o2 Z; A' l1 ~
$ |0 n/ ]; F) k, y2 q: ?3 z( H3 r0 x) V- c5 N; h+ q
            //copy data to upp_recv_list_busy
2 o7 Z: g3 L6 o7 S3 F            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);8 ]. w/ U! L/ g

. S: I% d( S8 S  p; e) A- @" u# V! d* k            //* u4 n8 [0 J5 s% x) h
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);& R: B3 s8 R* K

- F% `) j* w- f( i" S            //
7 L! A4 T5 t' P) l            server->upp_channel_a_recv = false;//- G9 {0 `2 X# R7 o' E

- ~9 [7 V! ~" k3 g0 R% n# z            server_msg_send(server, APP_CMD_LOG, "upp recv: success");2 N: D7 l, v( F! e: M5 @, O3 w% Q8 o) {
        }" g* t* b% Y# Q; C
    }
; {; [* l: }- M9 R5 K- N+ l3 i8 h' {- X- J9 ^

4 J/ [, M# k$ M; r! A. n# ^    return true;& A8 X. n, o% _( P; ~( q+ p/ A
}
/ N# ?6 s/ ]2 G, }# B% G9 a8 X7 u4 u" [- |
static bool server_upp_data_send(Server *server)" m  b. O0 `, J$ q( T' G2 l( H
{* U/ @/ Q: D  j, G1 A* y( v
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){- q4 W6 o# o% k3 K7 X  U/ \
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  H; C+ e- A0 ]        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);$ {1 e, G3 w; |9 {  O+ C
        char tmp[128] ={0};/ Y. v) r( D) X% [5 P8 u1 k* e
: I* C; L  ]; [! Y
        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 r, i$ a# A2 X" c
        print_log(server, data, 64);: ~; j( d9 G3 U, [
6 X' W, ?1 R; M% U% `9 a# Y
        //( i' M3 v" p# K. k. L$ B4 x
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& m: C! t1 q" Z5 n# ~5 }
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
) U$ U6 G$ M7 m        print_log(server, upp_buffer_b, 64);6 `4 T1 ^+ `2 K7 L: z) f* c

4 v3 M1 P; I, M3 x  j9 [- }        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) [. S- J# \, N
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
6 e# e" a+ p3 Z7 X" D" w        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;5 m6 E- e2 o1 `" x* E" c8 O
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;+ V8 u# ]3 Y" {9 E$ V* {  T
1 N4 T- [; r) x/ R/ V+ L/ R
        memset(tmp, 0, sizeof(tmp));7 @8 |8 X: u4 [9 t  P: U; c
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 5 n4 I. V& G0 _
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
' p) w% w7 h9 _        server_msg_send(server, APP_CMD_LOG, tmp);/ n; q* T9 Y/ B: P( {- ]/ Z

) {8 r0 y- n) _+ C) e        upp_error_count = 0;
( K$ \$ ?. n6 h/ y8 Y+ P        upp_dmaq_int_cut = 0;
$ r) p# B" q9 j( V3 `4 V4 m        // fill in data
) m- N* F7 F( y        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 M! z7 }- t+ ]# r# A7 Z8 G6 h: m
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");* `  v8 ?! l- k$ m; q% p
, f1 K. g( i2 ^. w1 E
        // wait send success
/ O# g1 R0 O1 q6 V( t7 A9 l/ M5 J        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
' p9 q/ @3 d0 v: G4 _% B2 v4 V+ Y2 l! R
        // make data node in free list 0 e( A; P- n  J9 N+ `
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);, x: F) H9 v1 t0 d
        server_msg_send(server, APP_CMD_LOG, "upp send: success");1 ]! }* L* {1 m3 S; I7 |
    }& P' z4 u. |, k- h9 p+ E
    return true;- M* k8 l5 u" E( u! [
}: r3 o/ R. E: O/ m
" u- U3 J% S6 z- l' J

% o& k0 e6 ~# Z) s4 o. `9 @2 m7 e7 M. K6 j
0 X4 n1 _2 Y; \8 h; J+ W0 Z
/ \% S" I7 Q! U/ H5 W7 V# d

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ s% o- ?  j& D2 D

$ _4 M( y& C9 E3 `  F

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-27 09:56 , Processed in 0.043517 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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