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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑   u: l5 A6 V$ L+ u

% e/ X, B$ S2 {9 o1 Y5 h5 }: x问题描述:) R0 U4 k6 e! u+ \2 t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% v4 a6 Y4 |: e/ j0 _' B
: `: i8 K1 D# u图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。. i" g6 F% I, W, U

0 b7 e$ U' V6 C: {" }1 M6 l测试结果如下:
. Q" G  |3 P- H/ o7 I. R138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?, V. i/ N' p% B% [& h

$ h) R3 `4 v% `2 H7 k6 s$ B% h) m
备注:
3 |/ m. ^: N+ i' X1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* @0 `8 r! w) G& F
2、相关代码如下:
: C+ ]; L  h1 f9 p8 W//UPP DMA缓冲大小512字节
4 _9 `7 z# V+ [3 u1 m6 A1 _2 a6 O#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
, g" f* a; [. j$ ?& v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' W2 k* h+ D0 ]  a. x6 t% ^#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% b3 N' x# X6 g: t' C* o# G) n/ K) z7 f8 i+ T
  z5 s, Q$ O6 f' i8 w
//upp接收、发送buffer
% e8 K. T% C; ~' \8 r, I#pragma DATA_ALIGN(upp_buffer_a, 8); L7 @5 P4 \; Y& u5 V1 g
#pragma DATA_ALIGN(upp_buffer_b, 8)/ J8 Q5 y( [8 y2 }
& J& ~+ d+ _4 l: ]' \& i( A
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
3 w+ c1 M. a. Aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
0 ~" _, Z. p5 q  y8 O" K* X' @! r: O6 P- y( O9 ?! I0 H$ d
! f. o3 W. f0 ^0 n, m
static bool server_upp_data_recv(Server *server) " u; `9 N# B# x! C
{  }+ @  K# z5 x- |4 I9 g5 t! D8 p
    if(server->upp_channel_a_recv == false) {3 N1 ]/ g% D9 H- G) j2 {) P4 P$ K" U
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) g; `2 J4 T" Q0 V+ U3 h        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {  }* P7 K+ Q' p$ P- x
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; ~9 I1 Q5 y9 t  D/ P
. w' N6 K. R3 u

" Q7 m7 v% R0 L" m) y' s            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( z4 r6 |) ^8 {: f- |
. p/ T+ }" k6 Q, }) Y- o
            server->upp_channel_a_recv = true;//  W8 E! }3 `; w( j7 z) t' @4 t
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
! t3 \2 d* T# j$ A: Y            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;% p  q# `- M! `
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;$ }2 j6 n# T: k
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 B' Y% p+ \" |) G
) b7 v% m; v( ~& `5 w6 z- Q            upp_error_count = 0;
' B# ]2 n8 _8 C$ e' v            upp_dmai_int_cut = 0;
+ D3 V# {- I9 A. o# v3 B5 \" ^3 B% ~' W  f, j( b* J) u* f) Z
            // fill in data
" a8 a- m5 G) n% _! H; U; S            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- ~8 o" s' F6 F2 F5 G* [3 z
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( w# U( U( R2 H4 v        }/ Y; A: r0 f) \1 X( e
    }
  d* _  y8 f" G1 J. g    else{
6 @; e" Y5 u' t0 [, |        if (upp_dmai_int_cut > 0){
3 d4 s: D7 R5 s' K$ K2 I* s            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
; c. v& z* @& l& q' \            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ h8 c1 Z, s& V" d$ R- T  P/ P; Q$ U/ l! n0 n  L& Q

- V* P  {# m! l            //copy data to upp_recv_list_busy
- W, A. ]6 E5 l( ?" O  Q2 K- \            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ l' L2 t  o4 e1 f7 z, k; }

$ U1 R6 D8 m" e! A$ d            //' C9 J* f! L+ I
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
7 Z: G5 l0 C' n+ Z/ W
9 f+ g3 R1 K; S/ [            //7 b6 O5 H7 F& K4 S/ s7 G& l; d2 V
            server->upp_channel_a_recv = false;//, u8 [  |, K: |& ~

- y, s4 V( R- Y8 }" T3 {) a            server_msg_send(server, APP_CMD_LOG, "upp recv: success");! B1 c& g. x2 j3 m. P  z
        }
8 B4 P: H) D1 u, l' o$ D    }, I; |6 Y8 X# S* B+ B1 W4 x& z
  c# v, [4 C7 W  ]  r

/ Q. \( P, Y1 U: T/ i8 y    return true;
: U3 k; {& }- E0 t}
# Y/ @! u, n$ Y4 S, u
/ C2 R- Q" |& Pstatic bool server_upp_data_send(Server *server)* m3 d. T( K2 v3 \* b6 J
{
& y6 ]% ?% Q7 X% G$ c1 ?    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
% B, q: C3 W' U3 _: y        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);; G* y4 u& _* @0 k
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
* G4 |0 a2 Z: b0 {: T        char tmp[128] ={0};
0 l! ^. {* m. _" K
8 `7 ^: J3 a, \# j8 x, ?1 Y+ l! l& j        server_msg_send(server, APP_CMD_LOG, "upp send: start");
' ?( Z  u0 }. {5 H$ c        print_log(server, data, 64);
. E2 x8 |9 t3 J0 N
( V- p4 }: R; Y" F" f" D        //
- T2 ]' A# B0 N% r1 G! Q        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ D. V4 z& S2 u% S+ `* |$ d* C
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);+ H+ f4 }! |3 G
        print_log(server, upp_buffer_b, 64);
+ B4 z: S, Y/ q; |+ e+ K9 U+ `& e! M
: g; T: ?; u& {" N, [        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);$ X$ L$ M' B, u: ^2 h6 I
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
+ B; [% x4 u! W6 }        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
2 `# J8 n& L  g        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
* Z* P' d) @0 Z5 Z8 }4 z7 Q7 P0 W/ `7 B6 e8 o( v# y
        memset(tmp, 0, sizeof(tmp));" k& B6 O6 Y* {7 P" L" Z
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
$ C) K, c( O8 C2 ~- C& G' t0 f            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* W3 _. Y: s+ \; W3 `
        server_msg_send(server, APP_CMD_LOG, tmp);
. H" B1 C" [- N$ e# A% c5 Q8 _. E7 X" ?9 [
        upp_error_count = 0;
9 _- b, W( C& Q! h        upp_dmaq_int_cut = 0;
7 T1 s+ Q% `2 E( t; X. z        // fill in data 7 }; \1 v: O, |7 {
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* E% z) n- l1 a2 e7 p" V3 ?        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. F6 I$ I2 @# M2 f  V) k9 E

5 |* ^4 r* z# U9 `  l4 z        // wait send success5 e: X2 i8 J. q( I, g) O2 P+ E
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' [$ A- F2 p' V& A2 G& z7 U

! |- x9 c% N# I, A, T7 j        // make data node in free list 2 ~" R; H" [3 |& q2 k
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);' Q5 m0 |# D  D
        server_msg_send(server, APP_CMD_LOG, "upp send: success");$ g7 S: j  i9 r3 w! n- ]
    }4 M& |8 T8 P5 n, b  T
    return true;# Q  D4 \4 Z# ~, I. ~, k
}( l* G7 b8 `: `& @: m

+ i/ L9 E+ D/ m) M! Y5 Z1 V2 d" y3 ~
" z) Y$ b- ]3 S0 ^3 Y

- B5 K, r& q1 s2 M2 A3 T

7 v7 O. z; \# O5 P- D, f6 w7 F
* R& j6 q: W! z# w5 ?  G

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐1 z% F: m+ Y* f/ ]. H
2 Z: D/ u0 c, b! W  `

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 13:48 , Processed in 0.043081 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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