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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 8 Z; `1 j+ _7 R- t8 C  r
9 Z* T0 \# P5 L& Q2 q
问题描述:
% \& P* h. {0 w5 c/ f+ J在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
0 L* g( K* s% s# b7 L# N3 T
# H* q' h% X: u4 K% z+ `图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 l  H2 x0 y9 ^; E

' ?4 W- H/ X9 F6 r2 ]* C测试结果如下:/ b& F' q- ?9 o$ ^* ]% t8 `9 j
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
" G; e  |) ?& k; g! x" r- M% v' @' B$ S" b; q2 S: i

) i" o1 ^! K- U- t; G) ^备注:
2 T- A* B: j( M& C% C2 V# h  [1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ {7 E. ~+ s6 S/ e0 w% [$ k9 ?$ p" G' B
2、相关代码如下:5 S' X: _: o" f5 C% i8 y
//UPP DMA缓冲大小512字节9 A' w. v7 Q  k
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍3 q. r5 R! i8 K
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: r( t/ {4 ?; }4 r1 }( c% a2 L
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)- U1 V8 H$ `9 k+ f6 v- Z& q9 V
! f, W. w4 m) H2 Q+ b- t3 Q
2 ~0 n0 O' Z! z' C* N
//upp接收、发送buffer. E  L$ P/ i0 q/ c' x  Z4 V( ]& i! j9 N
#pragma DATA_ALIGN(upp_buffer_a, 8)
2 ?* c9 s9 W7 U4 A, e#pragma DATA_ALIGN(upp_buffer_b, 8)
* X, [- p& {: W3 J6 |
, C# }: F% ~8 K) wunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
7 Y% J0 E/ a- j' m) R0 junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( p1 [/ m1 g5 S: K# }
* T1 x+ R# i) m4 I# Y' ^$ J
0 j0 Z: E5 d3 h0 c9 z/ }7 t" M# Q
static bool server_upp_data_recv(Server *server)
' ^8 W3 h4 g$ z7 ]$ X{7 Y  p; g& ~4 x  N$ k/ V
    if(server->upp_channel_a_recv == false) {  b7 y! E3 l0 {- j! g. J7 N
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 ^2 S3 s# F7 b4 ]4 b8 P        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {4 o" d0 o6 K6 r, j" L" m) o
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
( l7 q7 n% c  k& i8 p$ k2 P" a+ I% _0 l4 Z' p
8 K8 Z. u+ i) Y) `. T1 e
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ U+ M5 b( _$ a' H4 B& P) s. x9 U$ k, Z- Y. J4 ]! p
            server->upp_channel_a_recv = true;//
& E4 t2 C; u( l            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
# p! a6 U- E7 [: y5 V- l            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;3 U  N3 s: m- h( [' U
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
% o; _! t0 B7 ~            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
- c$ G( B, C, i0 X, A" Y
& H( o) |# `7 w4 N; W            upp_error_count = 0;
) Q, ]1 a$ O' N  f  T, z3 ]& N            upp_dmai_int_cut = 0;
4 G" t7 z, ?/ N# {8 f* f1 }( s7 N
            // fill in data 2 K$ N! T' Y$ {6 M: Q. q$ @
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);! }' @4 R: T2 s  v/ |% P
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
, `% F$ ]/ b7 L        }0 r6 I! j' ]$ |; ?
    }
% e1 A% }# R9 }    else{
, e/ Z) W  K. [' B$ a3 p        if (upp_dmai_int_cut > 0){2 F+ r! I% P1 f) Y: l8 F
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, j- w6 z6 b' h. k4 S5 M7 y
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
9 F& `1 m  |) a) h4 ?5 G8 Q* q1 [& B* u4 V2 o! v. G

5 H' n  Y8 T3 Z: C0 E            //copy data to upp_recv_list_busy
, o2 T4 L2 M0 S! b% b" b4 |$ v  q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 n: S; R) J! k9 g# X/ z* K
" c0 _1 f+ H. ^$ Q% |
            //
  o6 {( p9 b) }' I            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);" d6 X! W8 ~: Q" `  I
( _# D7 {0 M# t7 [
            /// c9 [# Q' d( N& x: Y
            server->upp_channel_a_recv = false;//
& M3 G/ S9 i8 T  N! o: E& j  E7 ^4 H
7 D6 x, o& s% _5 M( S            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
" ~  F% X7 I0 q. ~# k% F4 _        }
3 G2 {$ g7 c2 b2 M* p! }- k, U    }
* {: z& M5 }7 e6 q5 n7 C) r- z
8 t! g! l" x4 h3 L1 Q6 ]1 X8 E$ c2 i  ~2 S: V; K$ h
    return true;! w$ n5 m* W8 u$ E1 {  \
}. M& o; r" g+ o! K; }1 w. p7 @" P" R* q
& }' j! O9 v, k$ `. ?
static bool server_upp_data_send(Server *server)9 x1 L" T. b" L/ u4 t  {3 a
{' A( o, k! ?: \% ~* v8 e
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
3 ?- @2 h/ G2 b) ~& I        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);/ \5 P8 ?% B, [9 }
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);0 ^0 |: e  j6 E  w
        char tmp[128] ={0};$ a- D7 W! O- c! w- R% t; z% F: V( I/ o

  ?5 {( ]8 K, o  v/ r. G        server_msg_send(server, APP_CMD_LOG, "upp send: start");
0 C& H. t5 g9 o        print_log(server, data, 64);# M/ l8 x# s* U+ z( L, A/ T( o7 |
$ c$ W& @' H2 {+ E
        //' ?+ R. Y6 C3 b( {1 B+ E4 S  {+ g
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);; X# f' k; F" F
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 {7 h9 l9 Y1 A3 h6 e; p
        print_log(server, upp_buffer_b, 64);. G& F- W3 U  i/ V
, g7 h/ k4 r8 X5 a4 C2 S: L2 L( F# G
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);3 ~" r2 m* O1 s  K/ q
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
0 t* E: ^* y7 w6 L" {5 W; X9 P! n        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
. U8 k( N- O# k7 a* p9 P* A        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
9 g- q% Y& v2 M0 X6 X& B( v: @' K" R
        memset(tmp, 0, sizeof(tmp));
$ Z; }9 G6 I( [2 A        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
3 ^& C- l% |7 i: E: u            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- a$ H% e! I- B        server_msg_send(server, APP_CMD_LOG, tmp);
0 e" b! Y, z$ L0 K1 D1 i$ E0 V
        upp_error_count = 0;* r1 j( A" {4 a& b$ `
        upp_dmaq_int_cut = 0;
1 S% T  ?+ f4 N$ A: d- F, K        // fill in data & w+ U! J) ]7 W/ ^% }, I
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 9 p- ~6 s' ?" C3 `. E/ q) l
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 p* u/ V% h0 O9 a. [! k/ z( \9 w, f: J1 P' u" C8 z
        // wait send success2 i9 j/ d+ X9 @( l" \5 N& y. X
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
+ m, M- T9 p8 b+ M
% E! g2 z0 G7 R. {. e# f        // make data node in free list 2 ~4 X+ x! }* U, y3 _! }
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( ^8 {' I( p) r' h& S7 @) y        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 f8 Q! i/ M5 |7 E0 U$ h1 A$ {; @8 P    }
) p6 c. |4 l0 ~( W8 p    return true;  h1 a/ w- x6 D* a' v: O' [- }
}1 w: ]0 D) q! {( ?. v, S0 t5 p

% p6 M" N* \6 s! X( {
/ M2 Z) F. K( E6 \1 C1 J4 |# u  ?
* n/ ^. ~# ]4 t+ y$ n3 V7 t2 F

, \) y! q, L+ O5 W6 \& m  ]( ~* o2 B2 n6 I  T9 ?" @- R# Y7 U

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐6 i' S$ c8 H4 T& a+ V# s: c

' H0 |# t/ f, f$ Q0 p

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-12 05:02 , Processed in 0.041679 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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