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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 4 @7 L; p" m6 [1 |( M

! E7 W; Q# y( O问题描述:
9 m% C; a$ y+ g  _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& \: S5 G* b3 x: d. q
/ E4 i; ]& \& O7 \" j2 F
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。/ e3 F' R1 p4 Q
) E* M- M% V5 X6 D8 }+ `3 ~' p5 S/ h" x
测试结果如下:, z6 K7 D5 j4 h, ?$ i
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
  W) G& f5 h+ |
' j: c" Y" D9 y! j) Y* e, p6 z& ~( Z, C4 G
备注:
. ^9 t+ Z* T7 |# N0 H9 v, a+ B1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
) k" Q3 |4 _! {8 U
2、相关代码如下:
& E! ]; ^) r% D2 I! L//UPP DMA缓冲大小512字节: K1 `3 I3 K9 G/ c: N
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
7 |' D: l! w  }% d3 H#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* N+ Y) E7 H" ^9 r' S( ~
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" L4 t( r4 S! ]& g. Z
, r# K" U+ z) V. l( I0 W  v

( N9 o7 m3 q) g9 k/ L+ I/ X$ t//upp接收、发送buffer# v& |0 Y! E3 H  |7 |6 h3 o
#pragma DATA_ALIGN(upp_buffer_a, 8)
8 P+ V1 w5 T; j; F' W+ E#pragma DATA_ALIGN(upp_buffer_b, 8)/ y, ~5 I. I5 p* d9 g3 c

0 O* k$ T; h1 junsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
5 N; ]) u# H: G5 a- Punsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];: ^. `' l$ b! |
5 P5 l- r' d& @, N& {. {# K
0 ~) @' I" Y9 E$ |8 N/ ~" e& R. Z
static bool server_upp_data_recv(Server *server) ; j2 Q' Y- M1 ]2 E* r* z) ]& j. c
{
- q( i7 |( c9 ]' Y0 D/ v    if(server->upp_channel_a_recv == false) {
& v0 L4 D# u2 [& O8 ^" F, M# A        server_msg_send(server, APP_CMD_LOG, "upp recv: start");' E3 S2 g, ]% P
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {3 c: y& Q: g3 T& M9 [
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
3 d. z& }/ X2 w0 S2 l4 h/ C6 p8 o
0 i  |! `* U3 |1 e7 R3 V- y' V$ I" ?3 d4 o8 V
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);  y' Y3 _) }; \' L% R" ?
8 r, B, D/ ?- y& c  O( o0 ]% V8 }8 _
            server->upp_channel_a_recv = true;//" V1 d7 S! S/ z' S
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);, h+ _4 {- F; I. `
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;8 h  N" _5 G+ D# {* x6 M
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
& D" U0 [- c+ M            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 m% I0 Z, X4 Z

' H) _. t* e" N. f" j( S$ b            upp_error_count = 0;% O' C' Y' v. n; W! S' n* C8 U. h
            upp_dmai_int_cut = 0;# p3 Y# w9 U% k- n$ h3 k, v6 U
$ C2 z0 ?8 Z; V8 L* q% |
            // fill in data ' q# G! A- Z; w' I3 c
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
+ f( j/ Q( K! s) A: z2 j, A6 I) @* a            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");- t9 o9 B2 b$ h
        }
/ v& O. }/ }: V& H0 G    }
8 y+ h* |/ x7 o4 J3 h8 K: _    else{
  r- h$ |' J8 x6 z% \. B$ o, v        if (upp_dmai_int_cut > 0){
+ w* N4 w, ^2 ?* p: @            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 h9 Z3 J, o1 N$ Q            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) i% b- R6 g' g: g" K2 h
# e' Y/ z8 ]5 N. T* c5 i
: }& `+ y0 B5 k. v9 A            //copy data to upp_recv_list_busy& ^# {3 V% d- K% t7 y
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);& R" ]7 s& I! t2 {
4 m: E6 ]: `7 r; ^6 V
            //( l7 B0 c, Z8 o9 M# T$ ?
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! `( n% |. |: a( i) L/ Y
8 j' r3 f% X* ^. ]8 l: M5 W8 k            //
* w  |7 s0 g- ~' R7 h            server->upp_channel_a_recv = false;//% F2 e- @% d/ m& x

3 F( C; W% d  \( g            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
! V) {% k8 @& ]6 p        }
1 N7 D) X( Z4 y5 s+ n    }1 V( w5 A! P1 p+ ^: p' R; y
* H0 k: `+ c1 D: d; W+ ~" g, V

" r* K( K4 }3 q# x    return true;
$ V& d& A) K5 Y, V6 E) P}
7 n8 D8 s; s  J, h7 ~4 h: q! Y/ \# u+ e" U! e6 P
static bool server_upp_data_send(Server *server)
0 V# F% F! P* d) X9 F4 v1 A/ S/ O, [+ w{
( I/ s9 U! V8 Y7 h1 k4 s0 n    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: Y* l6 D+ f, c        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
$ u* S! T' t4 P. m        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" J1 ^$ n9 z) B+ B* _+ x
        char tmp[128] ={0};
* ~% j  R/ s' {9 _! f# `$ s- t4 T0 P/ [% {8 W9 C; J: E% n1 G* E
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 _, Y3 `& I9 m& }6 X, ]! y' ]        print_log(server, data, 64);
' {3 K) \! f2 m% l
" @/ I/ u( q, G$ ^1 E2 _: C" D- b        //" |" d  Y; T5 R" N/ _7 T
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& |% d4 _% K1 m: v5 D, e
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* p+ V0 A1 K% r& t* f3 `( p
        print_log(server, upp_buffer_b, 64);/ v& y+ `) K/ Q1 x( C% D5 s  I$ S
% G; u6 E" z$ D2 I! O
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);& x6 c' a; e2 R% v; R, D3 C
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
: L) F, e4 y. |+ T6 I        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
8 T& ], d4 X+ M+ |& L- ~2 O+ c        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
' c" Z' R1 K- i' K- B$ X/ K7 e% ^% A* U
        memset(tmp, 0, sizeof(tmp));7 |: T7 }& A- O! X8 ?- H& x& K' ]
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
" k# t  ?4 r. S            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) |1 t' m5 [* Y        server_msg_send(server, APP_CMD_LOG, tmp);% L0 c# ~$ M8 y  H7 W
( ~4 w4 s$ U! }5 Y5 ]
        upp_error_count = 0;3 X; j: Q# _% X+ A+ i0 M
        upp_dmaq_int_cut = 0;
; G. O/ {, y) X; F        // fill in data
6 n' ?" |+ a8 \% S        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , D$ k4 l8 z1 l
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");6 G# a& _' `5 g4 t

  B1 K7 m2 `) y5 _" T4 @& u: b        // wait send success7 C& ~" n0 e9 ^  U* t8 I
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # r1 r5 K. k* B0 v( D! |

9 E( x3 ]. D; m: a1 j1 l5 v$ ]: {        // make data node in free list
! f' _, q1 v/ m+ W8 s        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
1 G% b, D. u: @' k* Q        server_msg_send(server, APP_CMD_LOG, "upp send: success");
* W" M7 h, c( A2 G$ j8 R    }( T5 L: s; X' ?: G
    return true;/ u: E, x% r& M( I% l# ]
}
1 S' G) U( g' L4 t1 a. D8 p" k3 q3 m1 `3 c0 Y  y9 a$ B
- Q" r) d7 y  a4 ]( v1 l
8 i0 C, `6 t( z% u
6 }- c+ v+ s8 G. j
2 t/ ^. r9 p! c5 g, l

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ _! i. K+ \+ l1 E$ k- Z+ M" Q
2 Y" u" n0 \' h" w& ], X2 z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-18 04:36 , Processed in 0.041443 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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