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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " k2 _0 z3 q$ T* t% Y$ I4 ^
8 \. p- _9 B# d5 k$ D6 R
问题描述:
2 z; y: M( M7 q. f/ i5 ?在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
& y: m5 x) C& o- W
" b: x* M2 S, v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
. I7 S# \, W5 _$ c! P# C( O3 P! R" D. B0 C
测试结果如下:
/ p: L2 ?4 {1 ~: A2 a2 ^5 r7 L$ ^138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
) ]7 W$ S$ S% q! j
( }. e0 @! J2 }; q5 j
4 \* B. i9 Z0 Q3 x备注:
, ~- y( b; ^- }8 o( ^! V- }1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
, _2 ^& R) d7 `( ]' {# B4 o' l
2、相关代码如下:
8 Y' [- p; k7 f2 u* p9 q  c//UPP DMA缓冲大小512字节
/ q9 n3 ?( J4 ]( k+ Q7 `, x: i  ^% a#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
( |: [* L  x/ I: j2 r2 d#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT1 }, ]2 @: ^: U7 I' p
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT). U0 X# Y6 k* j* O& Q- T1 Y
7 j5 [, b9 e, P
1 @9 J+ i' b8 ~. F1 q7 n* {
//upp接收、发送buffer
! D4 a! t* o; a5 P' v7 v2 T9 L, H#pragma DATA_ALIGN(upp_buffer_a, 8)
8 y* ~6 W* Y" _4 u8 G#pragma DATA_ALIGN(upp_buffer_b, 8). \3 q' k, b2 f1 N" ?, K6 ]
2 S3 B, v  T4 n: X& \7 Q" ^) ^
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
- D) S! z2 u. j( N, {unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];$ P6 ?& ]# e; C; s

2 U7 Y0 G6 t1 R; q3 J
" e- }( G& c/ l4 ?& \static bool server_upp_data_recv(Server *server)   m& j& [8 }) z1 {4 k. F' ?# q  \. _
{
" V7 r! G, T/ Q6 i/ i4 @    if(server->upp_channel_a_recv == false) {: a; b1 d9 C5 Q8 j
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
; a9 D1 C& I. [/ |2 X4 ]        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {: \0 J5 I# N) p% B( y
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 U% n, I* N7 B% G) Z& I) S" d$ j& q$ M* @" s" B

  E5 \) w/ g$ P            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: r. R  y. r7 Z' V% t* i
9 X  S; ~! k0 {2 `6 a
            server->upp_channel_a_recv = true;//( b9 F# h( k& t
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);% T9 c0 ^, X- T, D- T  h6 ?) u9 Y4 |
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
: J3 B! N& E( K9 D* T' D3 r            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
2 n1 \) M. l& I, e3 X            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
$ k; [6 B! u% n& e9 S0 V% ~" p7 A/ J( }# U% X
            upp_error_count = 0;/ z- x1 V  X# _) k: H# ^4 |1 D0 h
            upp_dmai_int_cut = 0;$ L3 p1 ?* {+ ?# Y: Y, t* |( I. B

/ v: O! Q1 t- ?$ S# T- h9 v            // fill in data : ^" c* J  o5 s/ v9 |
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
! ]" o! Z  [# G, }& D3 d# {            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! @' v* W9 Y. O2 Q) u7 E        }
" w& A3 y% L3 e& q    }
4 D/ e  K# _6 b' {( ?  `( c% D    else{
! Q: Q2 N- M0 V        if (upp_dmai_int_cut > 0){
& u, ~, O# y9 Z/ _" u( p            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" _3 o( c5 i, j! h            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
# R- u) Q' W/ l) }* c8 A
5 k* J2 m! `9 _/ _% {% K: l: ?% I- r) C. R! c* n
            //copy data to upp_recv_list_busy
8 d  i8 T/ I7 d0 _7 \            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);" P# u7 F, d- Q2 H
: |, |0 b/ {- t, S+ _. O! j, L
            //1 M2 v4 v5 y$ U% O% |. Q  ~! ?( t
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' ]1 J# l$ v3 X) y# `. Y4 ~5 j0 S( k) v" J* |
            //1 j  h( [3 g2 @# Y. w
            server->upp_channel_a_recv = false;//
, C3 B4 i* o4 m; ~  o' {% z! K2 O( _' f  `! l
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");' E4 l/ _  T+ b6 G2 W" E
        }
7 U0 |& E' ~+ O' w% M5 L, M    }, n4 a+ f5 u4 v0 b2 s+ C1 U
9 Q( @3 K  s% S7 h" L

. t. P$ {# V8 E" S6 ~1 D    return true;
# e/ ~" v$ F7 V9 K& y}6 x  e" _1 `- n# T
! H/ N" }4 ?$ @7 T" n: e" N
static bool server_upp_data_send(Server *server)
% W5 t+ z- f2 s1 B- ]$ c/ M, u{# n" d5 j. n. P# y8 P; i  M& U
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
9 P! C" i0 g9 R8 C1 n7 p        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
6 n2 W8 s0 g: Z/ c% h! Q        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);: h- ]; S" ~# {
        char tmp[128] ={0};
' g3 O& Q' s/ }; V' ]- f2 v9 v2 c/ t! ]# m/ |6 k
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
  v  u, J2 h& _5 o: F        print_log(server, data, 64);! W6 ^6 h! T# y+ b

% r; Q. y" D2 o! \3 [+ Q" R8 D& l        //! [' o: w7 e2 o$ j7 ]
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);3 N7 L, m& r. m# N8 d
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
( I3 N5 |. T$ p* e1 C        print_log(server, upp_buffer_b, 64);
9 B3 J" Q% Z- I4 o
% g! W- E4 O$ {6 i! o- u7 P3 L        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);+ I; s1 l2 k' ~; G3 l
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
& R) ~" ?' k- v        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;7 y  g/ N6 ^3 \& f# p! v
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
5 R3 M! e* o  E& t5 @* o9 d8 w' x' B3 o2 b3 j
        memset(tmp, 0, sizeof(tmp));# v  E: Q" n" N0 I" U
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", * F5 u% _4 P; O
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);) g+ A3 ^2 U/ a
        server_msg_send(server, APP_CMD_LOG, tmp);
. m3 q7 U9 A/ ^0 l6 S" ~
4 b+ b; ?; L2 A5 v! K% d7 o) Q+ A* u: s        upp_error_count = 0;
  E8 Q8 e5 U' _( X- r        upp_dmaq_int_cut = 0;
3 L+ s  a' W- v" J3 I1 {9 O# p$ }2 I" X        // fill in data ) U0 p6 l# t& ]
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
% ?$ Q; a  [4 |: ^  [' C  w7 e        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. q; O6 g( l3 e7 y  D

% v9 S; i2 o) f        // wait send success0 R, M; B2 ~: d; v* y
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); % @$ {. C+ M$ p" C/ R1 \
7 ~; o4 ?: h, ?. e
        // make data node in free list
/ o9 j1 M% `1 ^# P7 i% \        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 y9 D: @) L% m& a, t" W3 _
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
9 i# b' L# e- T% n* \$ n    }
5 e  G: `) A; N# i! z: {# Y& y    return true;$ Q9 C1 N) e: O- h/ V$ Y
}
* O: l  v- E" m0 ?5 N
$ z4 Q2 Y1 R) G7 A$ q
8 f5 U3 I, V8 E& c; V
8 k# p9 Z  A+ S# w  A, E  T. o, @
( H! B' y+ f& [( J8 X( b

* u4 g4 z! @. d+ f! S. T

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ F/ k- O, O' o$ f9 s0 {, g- e" U3 @' n, H

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 09:09 , Processed in 0.056573 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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