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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 c1 A, ]& C/ X4 I" [6 Y6 n* ^: Z- r2 a0 u) F8 e4 J
问题描述:
* k% s$ q. w, V( K在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
/ F# }- N4 z4 \; `6 }9 z6 x2 I
% B4 l: s% B) l. @8 g图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 H9 s  L7 H) L5 O* S% |& \+ j# g
$ f; l( t$ A* X; o; S  \7 m
测试结果如下:
# A8 x. s' Q/ c( Z138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
; ?7 Z* m5 _# q7 r. f8 ^; y, I" A, f

3 m3 j! D/ S: i) q# L, E% m备注:$ c" J+ g; Y% n2 k
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. G- W( s: r( U
2、相关代码如下:6 i& T% u7 g) h& z
//UPP DMA缓冲大小512字节
+ q9 A6 r: f$ x* Y; d7 H, G% u/ U#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# |6 m- c' @4 ~/ v
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% ?8 e3 h" N  E! p+ v& ~  X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 y8 C: W$ D+ }& _9 n6 X" T9 K: s' o; q5 i
7 {" e9 O' |4 W8 s0 b
//upp接收、发送buffer
8 _( o8 g& T. ~0 ]#pragma DATA_ALIGN(upp_buffer_a, 8)
5 ^5 q0 q3 ~. V4 u' [#pragma DATA_ALIGN(upp_buffer_b, 8)
" R+ X7 N) q( g& C4 d9 i3 |2 x4 b9 C# s7 X$ I& A' Q3 n
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
$ X" G7 a' }2 U: Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 p4 d) n8 c5 }4 k: k, T

; C& c, U9 a' z8 ~8 s
, o% u% I  r% G% p, W( ?1 Y0 gstatic bool server_upp_data_recv(Server *server) 1 n( \  X' q1 M8 s+ o  @
{: P0 i# p0 V- d; N; s2 V* z
    if(server->upp_channel_a_recv == false) {
: |- K) k( s9 R" b# C        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; ]# }4 a* L& X+ T        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {, f6 b4 k, I7 A
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");! I1 K+ ?, B' h9 ?& r. `9 z
' {3 f# H( Y9 S' Q- y5 c" D% s
6 w. x1 Q3 K$ s$ c" a; N& Z; V
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);/ `7 [7 o+ v+ r% y' B" c6 }

/ Z: ~: z2 U5 E" `; N5 g$ ?1 \) f            server->upp_channel_a_recv = true;//
- W3 b& H0 `: k6 B5 O! y' w! |            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);  ~  Y! q2 t, M" ~
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;2 q' N0 p6 z8 T% Q6 e$ l
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;  I7 ?2 W$ P' U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//; s8 C  E: N& e8 w2 s4 ~' o4 u( T
5 y0 C( S- W# v
            upp_error_count = 0;
9 O+ B$ Q" U8 `, V5 Q3 |) z            upp_dmai_int_cut = 0;( O, k& [$ N/ Z0 x& S" r

5 R8 j0 c4 Z2 h            // fill in data   R4 h- ?) f, }  n
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
/ L' M9 E! O" v: y            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");' C7 ]# |, B$ O; `" e
        }1 e. ?$ I, @% I; z  W0 k9 x$ M
    }
1 l  [8 b) j  z9 m    else{
' N( ~+ `& U2 D6 _2 N        if (upp_dmai_int_cut > 0){# y- |5 c' p% e0 p2 Z9 V  Z
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
! N; k1 ?8 ?. Q( ~3 r5 d' S1 G            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
  }+ X: d# I  e- c: x; n+ [5 U5 X' G
6 n7 m+ f. I$ A( @8 G/ A
' C, u0 x; g9 Z3 b% a6 ?            //copy data to upp_recv_list_busy& K) q0 K- y/ g. h! P# f) |4 @
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
1 X$ H; L' F( c; w' D3 q' B, {1 C  c. c' T' u0 {
            //
) r1 u4 B) d- a0 J6 n            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);2 s% P" H0 Y: L2 I! C* |
7 V. E7 ]: W8 \, B5 t
            //: h' [+ M- C/ K% I9 {
            server->upp_channel_a_recv = false;//, `  o* k4 [# E( @# [2 g2 e

7 e% P3 i# [1 }- @5 \            server_msg_send(server, APP_CMD_LOG, "upp recv: success");: |( o8 s; V, Y6 s0 B
        }; r3 [( m5 h2 H/ u# ]
    }* M: W3 _7 D: x0 c; J( @9 b3 a
- j. p1 B$ X6 i4 b/ T) J

  I; s6 x6 @, m; c% w    return true;
% n9 A8 b1 \6 Z/ I7 n4 T) A}  P/ x0 W8 ?" \4 R' D3 ^2 d! I( D

' c+ e' ~$ X# `  Mstatic bool server_upp_data_send(Server *server)' U' }! \) k  s/ M" \1 h
{
! d( m( ], p0 I! H, r    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
) o* v; w: d& V3 k. F! y5 y1 _        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
2 F/ m- A  n2 h        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
% N- P5 ?4 O( i$ I2 O4 b. g        char tmp[128] ={0};
. i" q7 w3 f+ x# M7 y& j! p+ {* K: w
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 j% R$ y: Z7 ?8 G: v& A3 {# {        print_log(server, data, 64);
% [- m: e! {- C$ q( J. p; e
4 J* Q, r# T7 ~& A  d        //6 w+ j, Z6 n, u1 s! J
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
! Q% s* G& a. H" v        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 t5 i. E& C9 _        print_log(server, upp_buffer_b, 64);
: y( i' ?: H; u* N$ s
1 S: u# R) H! L3 \        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
" X1 u7 ~4 j6 O; o6 @        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
( c) H, @) A; Q8 d- G- V8 y* `$ ~! K        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; q5 Y. Y; E# Y- e, V4 h% [
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
% v% h# z# {9 |9 C$ P  m
) S- @* w4 y; B' u        memset(tmp, 0, sizeof(tmp));
1 a/ r( y5 F; j& X2 S        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 V! _: z6 Q% n' n0 F
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);/ t7 {9 g+ d$ ^" C
        server_msg_send(server, APP_CMD_LOG, tmp);
# d0 k6 _- U; d5 @0 q7 |" K5 N& g
# `7 r+ t- e, E' C: A! Q* x( Y5 L6 g        upp_error_count = 0;3 o7 K1 C$ @& [* T
        upp_dmaq_int_cut = 0;4 N5 i- H  g! r9 D  l8 B
        // fill in data * _: G$ `0 s9 y! _0 a( m+ T  @
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ; {( X  ^4 e- v3 m) W3 r% T) G
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");$ q1 A7 j+ w- _$ D& p( z# {

$ \$ g6 s; v7 i- D  f$ D7 K        // wait send success) L! i6 n' x  H% G5 {# k
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); . K* b; p6 g9 l  @3 U8 p
/ F( d, G/ e6 }
        // make data node in free list $ P2 |  ?- N* n8 b$ h
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
% e7 ]* b1 ]- {% h# _- p2 x        server_msg_send(server, APP_CMD_LOG, "upp send: success");
5 v' p: A& U* y4 }    }
) y% r* @- _8 Z) L; I    return true;0 r/ T6 f' E3 @7 f/ I: e
}
) y: Q8 c# X$ F; b3 @2 [0 @7 K9 W, d  p' W
9 v5 E1 }# T, e) i7 W5 [
- z# [9 |2 P) R. \+ Y: S; h; J
0 T5 f2 X4 }4 e, N* a+ z

5 P/ m" H7 _5 E9 x+ k

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- O0 N2 S" W' p8 x" H, j
0 C" e  T+ T( [- P

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-23 16:59 , Processed in 0.042649 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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