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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 * P$ B1 G9 p8 u# h" F
7 q  s. O/ r$ F& o- x' G9 L- x/ F
问题描述:
2 c* f  J3 e1 _在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:! R7 H; g" A& y, \& q

, |% |5 f* v0 |2 `  i; O* I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。) w$ v4 |( p' i$ |
5 C' C5 A6 l) |9 [
测试结果如下:
9 h0 @( J. y6 a4 B4 z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
( S! `, ^" q" M1 Y. [8 U6 y
! J1 j1 `5 T' f- e0 F( o5 x8 p8 g
" N; B! W! K. W6 s7 Y: k5 Z备注:
7 L8 Z) G% f3 ?* y! q, T2 r1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?8 W) z1 Q3 v( k
2、相关代码如下:
# J, @, r) N2 C9 P& A4 |' C$ @7 Q. ^//UPP DMA缓冲大小512字节1 A% T% |' h& k' P0 {& C. n  x9 t
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! B7 h+ q9 q- ]; F6 T* K( n) W
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
& d9 W* `8 M' p. |0 e6 h#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)7 E& @; Y2 l( u& ?2 w5 H

* O  b6 q0 b& A) Q+ B
4 P* ]: x( M+ r//upp接收、发送buffer: C! v# @" W7 K! b. p( Y
#pragma DATA_ALIGN(upp_buffer_a, 8)
3 D3 e; v/ X  F7 k#pragma DATA_ALIGN(upp_buffer_b, 8)
6 Y& r, m- g4 }& z) y/ n7 w5 h5 V& ?2 J& d( F
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
: L' X6 i9 G% y' W8 A$ Z# k. hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
" b/ v) A; z1 m# a$ C4 H3 ~$ a( j5 O/ w: X/ b& W3 B, G" N

3 ^, s  G. R" F! i1 g! {/ y  Ustatic bool server_upp_data_recv(Server *server) ! b" P! l, E7 E2 P  P
{
- ]% Z, Z7 e! P    if(server->upp_channel_a_recv == false) {# q+ U6 S; J* U) W, \7 p% |9 a6 @
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
: F8 w, v7 f" Z/ d$ X8 v        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {9 S/ J9 o8 x- K; b7 A1 V: i
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");- V  ]1 y) e3 r3 `5 S; J' I

5 B6 S- r# {; s# b4 E& G% {
2 D" p6 W, X7 M" d+ u            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* m/ l- B; ~4 l' j
: N' T" O" i7 B4 E. z, }5 H0 j            server->upp_channel_a_recv = true;//1 C  h+ l0 X, H" N
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);; c' u6 w6 {* M0 d! v% i6 a
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;. L+ t' w5 M; s) n$ T4 m
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
) s7 v+ ?% B/ ?3 w& p  c/ X5 h            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 F2 i$ c" b" e& t3 n1 T7 j$ c- ?$ C8 z& |& L% E
            upp_error_count = 0;. g0 Q6 ^. A7 W4 E
            upp_dmai_int_cut = 0;4 \/ ~1 H! w7 F( p
# d; U0 m& N4 N& W& k
            // fill in data . u$ u2 a( o2 @7 Z) `0 a
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' c8 c4 f3 |7 j; g. ~0 p% B' V
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");) X2 G, ?) e( M" c& Q- v
        }3 K, i" {) l3 T# k* {+ T- F5 W6 V* a
    }
; a7 S& H8 O. w; u1 E- g% s    else{& s' `9 ?5 T0 _5 F! h! u+ {
        if (upp_dmai_int_cut > 0){' R# P/ F* x( X) D3 @
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);5 y: w/ P- k  q: E7 _- X/ D- z
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- D: [% q% e& Z8 G% d

. _5 E6 A6 o! K7 i
/ u  u! U1 V* T( y; L3 w3 i            //copy data to upp_recv_list_busy
* Q' ^0 |; U( Q            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);- Y7 J& c: L0 ?1 A0 Q+ F
8 I1 ^' X1 f; ~: ?& D, V
            //
# {. L. e. q$ _3 U, y            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);0 s9 J; H. r& G0 M' L
1 A8 f1 x4 g+ Z+ x
            //
! {4 x& F  ?! |( D* J2 B            server->upp_channel_a_recv = false;//
8 ]5 {6 N# ]6 s, c* B5 X
; V' o- p) u/ N( T9 m" f  J" z2 s: v            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
3 J* K& K7 u  L- b, \- }        }
! p) H9 Q- J7 J( I" a    }
, v* A! L4 P, w3 F5 Z1 l. i& M" e
0 P' y9 E" q8 m
* D( s5 M1 t/ D0 c    return true;0 w6 g2 I6 ~+ R' l& ?4 B+ V/ W
}
, s& `5 L5 N7 e/ p  ^& `+ j3 @$ J+ F& K- v7 y
static bool server_upp_data_send(Server *server)' b' j7 H/ G% O
{
7 Y: a) n- h7 X  m    if(ListMP_empty(server->upp_send_list_busy) == FALSE){$ G- H! k# Z5 y" o6 P7 u/ S. |9 l
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 e3 L& N% Y, I1 F        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
2 E5 a6 f4 V: C  E' q" w- I        char tmp[128] ={0};
# O( I9 M9 |5 a4 T+ @$ m" }$ E
& [. V. A  p6 Y& A) K4 x        server_msg_send(server, APP_CMD_LOG, "upp send: start");  r9 {& ]& O( k4 U+ ^5 o( A
        print_log(server, data, 64);
9 {9 e  Y, k! U7 j0 b
- W* c8 h8 D; X2 P. v+ r        //
, A$ O& P! L/ n        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! g1 V$ L9 V; H- r
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* S* D8 a# x8 E% I% z
        print_log(server, upp_buffer_b, 64);
* i- j) R! s/ Q/ X
% [. S( V4 Y9 D# I        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
* T0 _, x) U* I+ x7 G7 v        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
9 J( H' W7 r& {  g: s' Z) `* R        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;5 J0 k5 [0 v: ~
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;: h# K1 u9 D( x# X0 E% j2 }; u& [
* |2 j5 b" A6 e
        memset(tmp, 0, sizeof(tmp));
8 _; k" \, {" C% M; N6 q) }8 K        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: g1 ~+ T, o7 x& _) b. ?2 j; d9 }            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
4 Z, w3 O1 y' l3 [% Y% A        server_msg_send(server, APP_CMD_LOG, tmp);
+ P; j* i% b2 ~3 [* O
! s# o. D6 C) e- c  Y: [9 G" p: E0 |        upp_error_count = 0;
$ L5 ]0 N- z( I+ O  [        upp_dmaq_int_cut = 0;
. n" G. l% {! g& e2 F8 V6 ?! X4 b: h        // fill in data
7 D# L' y/ [- x4 |0 \$ {        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
2 x9 }- G  _9 z  `5 K5 {        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 \* a3 Q3 Z- a6 z7 X0 n8 Q

2 X' P+ _- c8 k7 q: L1 f1 ^        // wait send success
2 `( r! P/ E' A8 ~  z        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( V, A3 T4 ]2 a2 E2 O3 |
# g9 a4 J  K9 T9 L
        // make data node in free list
  b8 E4 r- @- G! E9 a6 ^* q$ l        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: T9 a$ B) ^3 M7 z4 K& ^: M& R
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
& X: e, t6 D) z- C* d    }
" {* \5 t$ H7 N    return true;* V8 ]3 [( I5 y6 a' w" {
}  C7 Q! y7 T% A! `- C! i9 f' R% z
- }. O) n' F% K  `$ l

! _9 j6 Z3 M' d: ^. K) y
; m& f7 {0 d3 T; `- P7 b
( ?7 ^' G0 q8 X2 R

% H& H; M& n+ K. }8 t+ \

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐, n( a7 x# D1 N8 B4 A) B

7 f/ B, S  c, j& Y0 r2 [

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 02:43 , Processed in 0.041302 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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