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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 - E/ Z8 A( ]+ G% O

9 Y* J$ H# C) d) u* R# }问题描述:
; G- {2 t2 {% U2 l" V- J) c: _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:8 R4 w1 V5 u* o
: C; y+ R, O: e. H
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 q. J$ }0 X9 l  i
" X. e# T# O/ C* e# s& X7 \8 R! I5 R
测试结果如下:/ n4 X+ C$ X# O& O5 a: Q/ Q
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ l- Y5 p, J! U3 A3 G9 N* k# G/ \. a. }2 P6 |0 W- p
9 ]5 M5 f) p) f* N2 S8 T6 R7 R" G
备注:! Z; W) f* H" R: ?0 p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" s2 B% B3 P/ A; l3 k
2、相关代码如下:6 L) d" Q) x2 z5 B7 q
//UPP DMA缓冲大小512字节
( M& Y$ p- \0 x#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( h& ^7 `' Q. @
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
0 n% k. C+ j3 z#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 J5 V: P1 J4 E6 T4 V9 R% g; B, O7 {. T/ W+ V2 G7 j9 f

* ~! j  c+ t, Q4 Y4 d5 c5 f//upp接收、发送buffer
5 s; X& f( a+ e8 v#pragma DATA_ALIGN(upp_buffer_a, 8)* u" `/ k& g6 I4 F9 l! N: ?# n
#pragma DATA_ALIGN(upp_buffer_b, 8); ]9 R2 l9 {. [
- u6 J; D& o. o! P. p3 b/ J2 O
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
' e3 D  l8 O/ A3 n0 H' funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; }, @! R9 j) p  Q
& X# g6 J9 m$ T7 d* C
2 d7 D/ n# Z4 l" m) |% K4 ]7 H2 e! ustatic bool server_upp_data_recv(Server *server)
4 l/ A6 x1 w2 Q) U: I. w+ W{
, D+ t" d' r7 m" x, A    if(server->upp_channel_a_recv == false) {$ b5 {- W: A$ I1 Q
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");! O3 R& S4 H! d" C8 x
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {0 a* s3 e( w  w/ P% y/ X; Z
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 {0 ^% |5 P$ x) ]" U; R5 y! {! a( [. |, I" P: s& W
- N3 \! m8 `+ O& c0 ~: ^5 |8 C
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);9 [2 [3 D/ E6 v

" Q: p$ @, S$ a: S9 ^7 ~            server->upp_channel_a_recv = true;//$ F4 m  ~* E" N3 R
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
$ X/ E$ F# q$ g: ]$ w" a+ R            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;- w" [% L: M) p2 l& p% E
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
- K+ ^( D- O/ T0 w6 J            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//6 V) J+ O! s9 h+ Y3 l, T
! g$ g6 ~/ x: C2 \; q' ?! A9 e
            upp_error_count = 0;5 u8 G1 [6 G; `1 |, S+ x) \
            upp_dmai_int_cut = 0;; w/ O2 u8 E( C: y/ i
+ ]* j- D6 p5 h% E. }
            // fill in data
/ W: ^$ _7 v$ e& B% p3 P            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
4 z7 H2 Q# Q# p  {            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
0 ^1 j) X! z2 P* n$ O        }
# z+ y+ z& j3 ~3 ~5 @5 H    }- y$ Q4 y3 S$ Q% D
    else{6 }8 W+ \: ^0 J, G( m9 m
        if (upp_dmai_int_cut > 0){
# A6 C* ~8 d& J, V+ A, j# r            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
  L! R/ E4 K" \! A: I8 N            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- j& b9 {( I- g0 x3 S2 P8 M% M

" X* m3 j/ M# h+ N/ ?6 q/ t3 E' I; _& x% M" ]
            //copy data to upp_recv_list_busy0 [( _: v$ I$ N6 B
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);! f5 M$ M9 K1 K- Q; ?- s

' W4 K* O) c% _+ D3 q            //
' I0 {4 h  I  T/ J7 @            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# u7 [7 I. V  V" {
1 Y$ ]# X2 `. t7 u# o. G8 x* D  u9 s% o
            //) B7 _* Q' C" b. z
            server->upp_channel_a_recv = false;//
& S2 V1 L+ t8 t$ F: A+ E
4 Z" C8 h& }! H( ?/ e" k7 O            server_msg_send(server, APP_CMD_LOG, "upp recv: success");3 [9 z% n" z! r
        }* z! p$ o0 f( [
    }
. G9 c- [7 o) g/ t
; y3 V/ D# M4 {  a; T* R( l& ]) o
5 c' j5 E- Q3 P" d3 m    return true;
. J- w; |- g2 a* Q}: [; a3 a1 l: l- [- r

* U- R* s: e8 n6 {static bool server_upp_data_send(Server *server)/ j3 j7 ~2 d; `0 M$ K! K/ d* }
{1 E) f) T5 s- k% Q" v2 W7 Q& r4 H
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* ?8 t. \* ]% z; M; R1 Y        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);: f5 _3 n) ]- ?8 y3 K2 [
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 x$ @$ E# Q) `% r) g+ ]
        char tmp[128] ={0};" x& K( j  e# z1 n$ X
9 E3 U6 C; ~, t" u
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
! R0 S/ w8 ]7 h# n) K" s) E* f& b        print_log(server, data, 64);
( }% y7 j% I; r9 S# L3 ]  @1 g: L3 E& Q2 l2 U
        //
# E) y, t5 f% K: ^8 s        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& N! l1 [" |! ~' I( Y
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);) D$ g+ i" s+ x8 s
        print_log(server, upp_buffer_b, 64);; T7 N+ K2 z% ~2 r

  [/ E3 O* ]4 h+ R" ^* a        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
5 a! w' p5 h: R% i! A        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
$ f5 e8 E! d' r( n        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;' c; ]/ z# i' w- n& ~4 _8 Q7 l0 d
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;! a- T1 f' G' R: g+ J- h

! M4 `0 ]; I5 H# t. [; E        memset(tmp, 0, sizeof(tmp));
! Z5 l6 o5 p4 d3 R( Y( C% {2 K* k        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( Z) r. i( S( w$ H3 r            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);- w+ q$ d9 q. i5 N6 O
        server_msg_send(server, APP_CMD_LOG, tmp);( I- L2 D9 O- ?+ x
5 s0 B7 G" W9 n8 {0 r
        upp_error_count = 0;1 v) H% E  j/ V# @( @* v1 d
        upp_dmaq_int_cut = 0;2 W* G  F4 W( e; A2 @
        // fill in data : _" G0 [6 u' Q2 ]7 }3 \$ H
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   Q3 j! h2 ?$ P
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");3 R8 |, R9 ]8 _, p9 M. {
, L, ?; l1 U$ s& J/ L* d
        // wait send success
$ y/ _0 k, p# u$ _; r& o        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
, @% t5 X$ o4 B9 I: O" ^
3 ]8 F' R! o* B0 }        // make data node in free list * j% n/ O: ?& o$ K( k6 X
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
2 A" R* `, R$ n3 y5 X        server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 r) b* y% m" N4 Q    }
( F% e* C( q2 z) V! b    return true;' ]; P$ N8 l# Z. R6 a* C, ^0 E" v
}2 L2 d, Q8 O$ o9 i3 ^
) X" V2 g% W/ c

0 u  l3 J1 T" g, t1 S- p: ~+ q6 b+ h' r3 f9 H" |; b

3 [( r! Q; z# R: u1 l" s% K
5 X1 b9 m# T  M

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
% B( q5 L4 U* b( V2 U
0 |3 A2 q* @! j6 }! ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 13:34 , Processed in 0.041310 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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