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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & e- u) x8 `4 {1 i9 o

- C8 l" M9 u  f% |5 r4 F问题描述:! l  ^3 E) A8 o
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
5 Y# ]. L$ b' s3 h1 F$ Z: k6 b$ b' v/ Z3 D/ l
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。# p! Q# H) R$ a% L1 O

' i* R% i% G  ~测试结果如下:' D( W1 D3 \9 D8 f$ n
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 y6 Q1 B! {$ z* ?" X  m/ C. i) H/ ^* [1 h" p; T

" V: d( U  o# K- g) E' F备注:8 m" J- V3 K- T
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" c& c$ f& h, h- `
2、相关代码如下:
& B6 R: U: Q! F1 ^  ?9 M7 s//UPP DMA缓冲大小512字节
1 v; m/ a1 Z* s5 B  N, e#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍2 V. O3 c) \- H' A5 Q: i
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
+ N# D) }+ U7 L#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
  I/ Z. \: g" k( c6 Q) d2 Z+ U/ P. t7 _4 `; S% }& p
; g  ~9 |6 Q4 E3 S! Y2 j
//upp接收、发送buffer
+ U+ w" N( r0 J: D#pragma DATA_ALIGN(upp_buffer_a, 8)
! k: j7 S) ]- T. S! n/ n* q. l#pragma DATA_ALIGN(upp_buffer_b, 8)9 q5 ?& u6 d0 v- p$ @% y

) C1 H8 J' K# i* Vunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ [! B6 Z1 I/ z* F" hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];3 x4 V# U. y0 |% Y6 Z3 Z5 H
* `; D( Y) r4 H* M' W4 f: J8 u

# @  {  I+ ]$ ^! ^- A; y; m+ hstatic bool server_upp_data_recv(Server *server)
7 A7 g3 y  k) L* ]0 m7 y{4 W* f0 W7 V+ L3 v5 v: v, ^1 Q" \
    if(server->upp_channel_a_recv == false) {# w& x1 g: w  x( \  F: h+ |
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 }$ K( N% K& ]$ r        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# l) ]# f( l7 ?% j
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");7 r( j% c) Q! s! _: p9 e/ [

& G  N/ m6 s; V9 l( B" k' _0 v; n1 D9 H
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);$ Y! A% G, {% x' M" F, W

# l/ x  r9 F6 e: s! d4 b            server->upp_channel_a_recv = true;//  {7 o; m: s- `5 c0 W- e
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
$ I2 r! }  B" R& B            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
$ O7 @. u/ \9 C            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;6 f8 d$ ^  n( H9 c+ _
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;/// L% m, U" Z& r

0 \3 P: [4 q) x. h8 ^+ R: y2 _            upp_error_count = 0;' O: I: c8 l0 P! Y* I
            upp_dmai_int_cut = 0;$ l/ Z2 a2 _9 s" I, g/ G% p1 q" a

0 T: v, N, ], w! ]            // fill in data ! e4 L* r+ a# a" G- x+ |4 l
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% ]4 q' \  b' {            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");, e' p7 D3 p# y. _/ ^( p7 ]( F0 N. }
        }
' k) e: N& `, `; ^7 }# I* `    }( F; u9 F" P, _6 ?: m- G: z
    else{
& S  u2 u& r0 Q8 a        if (upp_dmai_int_cut > 0){
7 L) M6 J+ o$ q. U            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);; Z7 t6 Z8 V2 f1 E7 D
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
5 ]  N' n# v; v  \/ d* E/ _! G9 Y9 H# A3 J% m  Q( K

) A- r( |) j1 }, `7 i# ~/ x            //copy data to upp_recv_list_busy) E, d* O: h1 r
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);  y# ]; `# O# a! O
2 C; q5 e  K5 K9 W9 A8 H- I
            //9 ^: f2 |. s2 V6 k) Y6 u
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 b2 @9 [  z3 u; ^6 ]& N" w
% x) n  _7 ?5 B( y! g7 H: g
            //6 Y' f0 K1 T. C& ^6 O" x1 P2 t
            server->upp_channel_a_recv = false;//4 \8 k* H3 ~$ b: }

6 l) |" C. f- Z4 X, \+ q            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
  Q7 y( r4 x& ^0 Q2 Q. P        }
. p- k; d6 N/ _' l. V1 O1 |* _$ \    }! E# g; y1 T1 C, R3 Y

5 f' L* f9 V/ X' y- x$ b: D5 m  M
% f+ P+ ~! l: x2 M& _    return true;# y) w, g. S" V2 O
}( l8 ^; [. p0 p% E$ ?
7 O$ Y+ Z9 ?  T1 p- U! y6 e+ n( b
static bool server_upp_data_send(Server *server)
$ n; \; i/ J, N{7 x. |- k. t5 T$ h5 T* J
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' f& {9 k7 Y* q+ ~  T  O
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
# ^4 g  h  S! @" t2 X+ z        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);) @! g; l: V( m- W
        char tmp[128] ={0};3 M. o, G1 w8 j$ u. N8 M9 y
8 N, i( A# a! s/ G' ]* J
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
3 k' u; o: o- z' G% Z- X5 i. ]! b        print_log(server, data, 64);: G0 S" A2 u5 B6 p; _1 ^$ v+ ]) p

  M9 \* _* P( Q  ~" K# e0 A        //
3 K4 S6 m  H( K8 G$ P        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& X5 k+ q7 N" @" h/ _
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
% P. ]4 C$ V4 y) v$ P        print_log(server, upp_buffer_b, 64);
8 b( R1 @, _3 i- ?  V& c
4 j# l' j8 d$ c0 f% a  |        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) y: H# O9 p- W
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ' y2 D7 y2 p' I7 g  W3 t
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
. z5 p# j  P8 ]4 D7 z/ c        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;" `/ e4 @/ K/ }9 U" r0 R
7 K  f) Q5 Y. k4 _' f
        memset(tmp, 0, sizeof(tmp));
1 J( A6 [* r2 H/ B2 E4 Q        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 Y/ C1 V9 @/ L4 X" q            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);; b/ |" A" a2 s. o
        server_msg_send(server, APP_CMD_LOG, tmp);
3 x1 ?! x* i9 _, l# l7 K
, N5 e$ }+ {# B' c1 o  n8 k        upp_error_count = 0;
. s! Q& F0 w3 `        upp_dmaq_int_cut = 0;. m1 o- N0 K* a! x8 e4 _. N8 x
        // fill in data / Q2 i3 b# ?% j8 b6 `  W
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 3 a9 t' B; Q9 a
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' L- @* ~( [# e2 ]; r6 k. E
1 E5 u) }& H1 d5 }* ]
        // wait send success4 r2 j0 s) I: j$ q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& ^" ]; s$ _) E! c3 l. I1 G$ \) ]% F; n% J3 Q9 n1 ^% j
        // make data node in free list
( k. i3 c; F/ T$ v        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 [& M% K' V; W
        server_msg_send(server, APP_CMD_LOG, "upp send: success");) H. H1 o# z0 Y9 t6 G1 E
    }
( M: g1 `; _# d# ^! B5 X6 [) [# {    return true;5 e$ X+ E# |2 f! n
}5 p3 I' s. `# N& a1 ~3 n( V
9 Y# x" i* ^+ Q- U! s
, Y  c- C1 P; A  Y% @

( G* P6 n: }/ _& l
4 P% _$ X! b( [: H8 F9 k0 x
+ U, M3 @% a( e% c1 V- ^  q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐- Y1 H9 o! M  J/ X
1 d1 o& A, {2 n, k  h

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 01:56 , Processed in 0.045688 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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