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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ( ^: m7 y3 [( ]4 I
3 X" s$ e4 C. b. @
问题描述:6 ~5 h0 b! m5 L1 \6 d, e; {5 j
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ m  u9 A; _# [, b: q
% B. f2 S9 y+ m1 y, C图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
3 A" a" `" x3 Z" C2 L( m# c
0 v* M/ c) h$ K3 N测试结果如下:
* F' j. d* X1 P3 F  i138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?# d6 N& \- p- `
2 O# F: y4 N: i& V' W* K" n* k
; [' {( s8 Z/ }* N& B' o
备注:  t$ a( V$ a: g" q- L
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: U  h% x' C( j
2、相关代码如下:' F! R: W" h/ z! `5 C: O
//UPP DMA缓冲大小512字节! u! |0 d2 F5 n
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍) y' a. X- ?6 ]
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 N+ x, R& n* }; d- X4 e3 n5 k. z% r
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)( ]* o+ y9 w- e7 O5 ]6 d, ?! I% S) Y

/ N! U5 W4 r! `7 x# F
0 ^1 a# I, P3 H3 T- K//upp接收、发送buffer
% D+ P0 H" M$ q5 A! Q5 j6 {" z( }#pragma DATA_ALIGN(upp_buffer_a, 8)! `8 W1 b2 {$ j3 F0 d
#pragma DATA_ALIGN(upp_buffer_b, 8)2 v8 q2 j8 L) r& t4 u4 j" w  M# l' O$ x

2 y4 d  e2 d0 d) U- ~unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! G+ ~9 m  e. P: m  e3 S" o2 {
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 u7 M9 ^& c7 `5 J6 T, C6 H" i, ?8 C0 d+ N( t

! T$ v; w. I& D( Q6 {static bool server_upp_data_recv(Server *server) ' ^9 B; J2 M6 I1 }3 _0 c
{6 ]. ]& ^# K: k0 c! B8 t. t2 y3 @
    if(server->upp_channel_a_recv == false) {0 @; B, t/ U. b; {( R1 p
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");& ]. q; q: x& C
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
( T$ o" D7 i# C/ r            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");& H/ p4 H% s8 b& Y: p/ E
. L( j4 p' X0 i0 b- L( p+ Q

5 l- T7 ^* p! Y0 N            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
  }: T8 S3 l8 g2 t1 z# u5 q* S' |0 Q, v6 b
            server->upp_channel_a_recv = true;//+ \: Q8 h, [% E& e' D7 B
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);5 y3 w% f! {0 t( v
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
: n6 F  {. `) Y* H            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;3 m! @, X, e2 a2 }% s$ F4 \
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# [+ a" T. j$ K7 P* s% P# E
4 t7 t5 k9 s; j* ~/ `' I4 u            upp_error_count = 0;0 F: x& K9 ]* {% r2 `; X! D3 \9 V# V
            upp_dmai_int_cut = 0;+ m8 u1 m( I% b: v
* R  \2 o1 O$ s% H" \5 h6 Q
            // fill in data
- G# R/ k% W$ S0 e7 Q            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);8 s) G; q9 r* ~- _! ]  Y* Q/ Z+ ]9 o
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% Z" D  H0 j, n( B' a% D7 [        }5 y/ M% a$ G. `* U. T% n5 k
    }
- c0 I& l" c# X6 l5 L    else{5 W6 @$ b# S3 Q5 n
        if (upp_dmai_int_cut > 0){/ e- o1 S" M4 W# ?$ _$ a) Z
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" \% _* E, B' T$ k            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 ]: Z  U9 N5 t6 \, k
9 |$ K; C6 s2 T
, G/ R. g* `8 z5 }6 ?4 H            //copy data to upp_recv_list_busy
2 d( T* ^. S& z5 m7 P. m: ~            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, L1 O% }2 X7 A8 V2 e% o4 C9 B6 |9 T

. G, z. O6 a, S! m            //& b  Q. P. ~9 z0 K, T/ H
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);* N5 t4 A7 K% P+ |3 }
( y) M( L( H5 y  ~* N2 x9 t
            //
5 g$ X" w7 \4 H8 L5 n0 ^( o" X            server->upp_channel_a_recv = false;//
7 L' i: I4 p+ F2 [0 D
6 D2 f0 b$ y8 F  {, x            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
1 u6 k. J: @% R1 H3 a        }% g9 U( ~9 X( X3 b! s
    }
8 G! P: A2 s' R" |( Y9 s! g6 [
; m& d5 r& N; C* ^2 g9 y" m6 w$ o; B2 \/ h- f. s/ l8 k, @  \& u6 B. @
    return true;- x; \* v1 U8 y) D, [& p
}% y! g1 H8 e( w8 D2 K7 z

! G4 @+ n, b/ p* r$ l( p3 d; Tstatic bool server_upp_data_send(Server *server)
) v* T* X9 F# y7 w{
, o+ Z' o6 h. [9 [7 [4 j    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
* L7 M+ f) j/ a6 L  z: a        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& u* q/ @* _; p; k, n5 |# R5 z4 W        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 D; f6 z: N% u: L  U  d
        char tmp[128] ={0};
6 s) W8 A6 r+ I; u: b" Z8 ?: f6 e+ D5 t: U: q& g
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
! Q0 j# ]& K; {: D( i, h" A; z9 [% l        print_log(server, data, 64);
. E. g1 c8 L( [/ L9 z$ P2 x* m$ f$ r/ M$ n8 t
        //
2 N% ^9 k4 P0 T" h) z        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: q  Z. }" Q# l        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
3 X; z; @3 C! A( ^. @! p        print_log(server, upp_buffer_b, 64);+ g& {; O9 I; ~. X
7 {' r. y) o( i3 ~7 e
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
8 b3 `, `8 p3 x; S6 K' ?; ]        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
& K/ R3 c) Z0 w5 s, e        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
4 g+ b" a/ N7 }: ]1 }% a* f2 W        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
  t7 A! [* P; I, E2 O( y2 }7 i6 _( q! B8 e
        memset(tmp, 0, sizeof(tmp));
" F% \9 n+ w; Y. z$ \        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 i  W3 j6 p4 P/ ]
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
  i$ J0 G- P; S: D, \# d% O; R        server_msg_send(server, APP_CMD_LOG, tmp);0 M) E  A  W3 Z

5 I% H: o, S2 H5 e( D        upp_error_count = 0;
! u/ ~7 `. e+ n: @        upp_dmaq_int_cut = 0;
; t2 J, p+ X) I        // fill in data
9 q4 f! c$ v  |6 J- R0 r        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
$ x( x0 n2 _# I( T% Y4 ~9 B        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, C  A0 h: H2 a) ^' p% h+ a3 Q( I! s9 o, |* A- N" g3 s0 t: U, u
        // wait send success4 A5 g% ?( [! X
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 ]5 O/ @" q! O) j. K7 N( p2 V) c2 q+ h! Q* _6 X9 D
        // make data node in free list
8 G/ O( M2 U; ~& ^7 q; N        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);& N$ h- q, G" @% b6 w
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
; G- o/ P  i: `1 h" l    }
( z3 M9 E2 s0 }' c* d$ e9 y* J    return true;
: h4 G" }- k" N/ h7 l  H) o$ z}
& @% }* K2 |5 L3 W9 c4 m0 R- z2 I$ q+ P0 ~% {( T6 I

4 }  L7 y2 d+ ^$ c/ a3 z
0 R' P" D) ^% r1 o1 }1 m7 U

/ O8 P: x. q7 \1 e* \
1 r+ E- r* f# R# x; {/ A' ~" ?4 X

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ Z4 C8 q. i5 T" E. B/ `0 c8 T3 ^0 t' I; j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-17 00:22 , Processed in 0.044589 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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