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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 , Y. c2 T6 [$ A) r8 ?* B- S# m

; w9 V  k) P9 E5 s2 ]. v: g8 W9 E- y问题描述:
% k( P& n+ T1 g+ \( m7 }6 k在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
1 q9 `( M9 b8 D# \+ l/ w6 U+ n0 b5 T  Z/ J4 p1 m0 h' D
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。6 [& H- G$ R9 j( c# K! v- h

$ i1 z% ]: m+ ]测试结果如下:
3 }2 \% ^5 w+ @3 C) _, o138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
  n5 z# ~  J3 J
, b0 a' M' W, I
1 I, P- g0 Q+ H% E  A+ n, e. }备注:
8 B! q7 F6 x' ^8 W& v1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
4 {- c( Q% M! c9 a0 `& r8 d
2、相关代码如下:5 F9 C( r0 G, J$ B$ O; ^
//UPP DMA缓冲大小512字节$ j8 D4 _  }% t0 h2 R' k4 `
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍+ }" z" ?- C2 w* T5 L  w
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% ^8 Z3 {, o4 P7 }8 l+ A2 }
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). Z* t3 l* ~$ O/ ?" j) b' B! c
( x9 m) E" S5 Z& h0 m

) j4 Y; b: n7 |//upp接收、发送buffer
, d, L8 M4 |" Y8 w6 L" U, N; _#pragma DATA_ALIGN(upp_buffer_a, 8)
1 z) W. Y4 c5 N# H! O) X' ~: {8 |#pragma DATA_ALIGN(upp_buffer_b, 8)7 \. g0 B* e! C, v/ P
! R0 j9 O8 r9 [) g0 v- d, @6 ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
+ Y7 t- s, v' Y1 S  z  munsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; p- M; L) p+ j0 G: t- N4 o' ~1 G: V' @! ]) f) z

& n( b+ z2 G- lstatic bool server_upp_data_recv(Server *server) 9 y- M- ]( D$ q& j' n$ f8 ~+ ?: a: S- m
{
+ o) j+ y/ I2 [  k1 r- [    if(server->upp_channel_a_recv == false) {8 J/ ^4 n( l3 o% p5 k
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");, n/ v0 O/ H" K$ r% y( J4 X) L% o
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {7 [2 F! t% m& b) d
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
6 P! [4 A. v/ }" h7 L  A" z7 s4 d) F% \" w

& F' Z, w2 ]2 O$ H! {            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
4 L# G: i2 t+ Y9 W. k/ K: K- Z# R3 c6 H& \( x! q
            server->upp_channel_a_recv = true;//5 [0 L# i( b8 D  y' v9 ]& [
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);% u3 h6 W' n* @' f2 D
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 y) k, |5 }  p; Q0 ~, p6 j
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ C8 b4 P2 b$ P- a# L  A% r            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# A$ l3 {4 T2 `6 A. w/ g
' m) i/ q$ P' x: ?' x$ N            upp_error_count = 0;& v$ y- X' c5 S3 h
            upp_dmai_int_cut = 0;
# T" r; l7 [" C% E- q# c+ _7 M8 O. z" z
            // fill in data : }4 y8 T' m4 g; j0 x9 g
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
$ E; B( ^+ Y5 p. H4 }& Z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
  T* G+ F9 D7 H. S        }
$ L/ r- v9 k) M: V6 w    }: @9 e! s) z1 n6 @* f
    else{
1 z; l$ Q7 f- \- h# B9 h0 c2 J        if (upp_dmai_int_cut > 0){
8 V) h/ s- o. t' S! D# z            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
5 [  z  ?5 ^6 A& [' B            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);1 S4 P4 e2 G: T3 w

& i  \1 B# [5 o
- v" F3 X, p& r            //copy data to upp_recv_list_busy( a, ?6 {. t0 h) L8 c$ h& k9 t7 W' [
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ [! l5 v# @" d" j* {2 x
! T: A6 ^8 f# S$ R9 N
            //0 U  `, R. E1 r5 \2 Z0 X+ T
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ A2 |0 L) j) ]/ A7 s

- S  a- |# X9 Y            //+ l0 k2 q/ f- P
            server->upp_channel_a_recv = false;//
$ W4 N/ k8 G4 A! N2 V% G( C; E" g- `! V: l
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
6 L- a9 E1 z/ t8 L4 w        }
, n) D2 }  |: r; j  W    }, u( ^( Q& W: b1 F2 d+ ?3 J

8 S" G( X4 Y3 H4 E+ w+ S9 `
: X0 p( q) m5 E: _) o5 H' H' k, c    return true;& V9 m, [+ q6 K. A. B
}
& ^2 N( V! a' R8 W$ \. I* G1 v/ [( U& D. J# }
static bool server_upp_data_send(Server *server)( L: ^/ D: c* t# W0 d3 v9 B/ v
{0 o4 @/ v- j9 o9 F/ V1 R( X- S
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){3 v( \. ^: E. n9 H5 Y
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);9 M% o' s1 W8 E% F0 N
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
  P" s0 _. v. N: j) N1 W; ]0 j# E        char tmp[128] ={0};: G# u- w9 C1 p( {

. G; m; E' o7 o8 i; Q8 w        server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 N# a" h8 D# l3 v- A# ]0 O3 W        print_log(server, data, 64);
4 Y. P4 O6 n8 S
0 `$ H, u" m+ S; _( D( k8 Y        //$ V8 u5 g+ m& R2 Q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! Y* ~1 k9 N; P1 u3 Z- p4 l        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. s7 C$ j) a0 O
        print_log(server, upp_buffer_b, 64);  L/ @: v. p9 ?0 R* l( y

% V0 E/ p; C' g        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);6 p+ S+ K0 S) F' S( t$ v# ^
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
# D& ~' H" Y$ n& X" T7 r        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
$ z4 j; }( V' ?/ g5 Q        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
# G7 X( U+ x0 a
% e% B# _9 D( S2 z' E* N- J2 Z8 s* m' n        memset(tmp, 0, sizeof(tmp));
# |- j/ j& S6 Q; W. J7 ]8 X        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
! o0 C8 m) ?  l6 M* }& M( c: }0 O            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);+ c# R2 g6 j% r2 r3 G8 k2 y3 B
        server_msg_send(server, APP_CMD_LOG, tmp);* M3 j9 ~; ]8 |- y) L7 c% U
+ ]% N  n* B$ {9 _
        upp_error_count = 0;0 R: ^/ Z- C6 B
        upp_dmaq_int_cut = 0;. H1 U% _7 o/ E5 f8 @3 T: q
        // fill in data " L; \1 S" E+ H: M0 r1 D
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
+ |& _% E3 [. u4 t        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
7 y9 `2 c: {9 q# p# c2 h9 m
6 L0 ^* R0 w9 }- }        // wait send success& a: r# A' {# [, C7 s
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
4 x& Y% m8 m( V( O4 ]; E0 G, [) }' @' q2 h. [0 w& N
        // make data node in free list 2 d2 U- a; g+ f2 q1 Q
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
9 i6 {. j. h& A, |# X9 u! j        server_msg_send(server, APP_CMD_LOG, "upp send: success");0 C6 f( X% ^5 g4 H
    }( z3 M! ?7 W& p) T- S" ]9 ^
    return true;
3 @) J& M. p1 z* K}
/ p5 V: Z1 c" s5 K, q7 L' F
! e( J; u* D# \- U/ n, K" G
! j* j7 A; D7 _% [4 m
  q$ o3 c3 q; t! c2 H0 }5 @/ s$ |

4 F1 J; j( Q3 H. n+ n: n! r9 O$ |9 w' X! v

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
0 s. m* h/ s/ E- I0 i/ r- u# z
7 Z- T$ w- H9 e) f, B: |7 ]

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 14:43 , Processed in 0.042060 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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