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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # I) U+ j% e7 p3 C2 Z2 D
, y: S; Z+ c7 t7 H
问题描述:
8 {5 e# z  o$ V; C# z; j  y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ D. D' R+ Z: g; N' Y. u, d
3 I/ E0 g! m! k
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。( R4 ]2 c5 \( q0 S$ b, {

, \& [5 H* l0 I3 b" M7 s% b. C! v测试结果如下:, y9 H1 r: d9 m& X1 G
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?# @4 A+ T+ Q& \: V# ~

5 K) ?$ x& q5 N- L7 H' M! h1 I% O9 P6 q: C1 _, q1 H  b- f
备注:( @! h& n% y) D4 h7 p1 U( k8 w8 o
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
  u) E3 O* G( x8 y. l
2、相关代码如下:3 k% ~; k# n5 C, Y: J& Q
//UPP DMA缓冲大小512字节& _- z' b& P2 j# C- k4 M+ w0 n; W  @
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  `& y1 o* r# d( s6 D
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
5 G6 y# a8 ~, w#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
: D' J! J- H  s) o( Y2 L6 D2 x4 M5 ^

# O- v! v1 V. d9 f/ i# J1 e//upp接收、发送buffer+ o+ ~4 @" c" l) [
#pragma DATA_ALIGN(upp_buffer_a, 8)* c8 S  f( T4 L! r
#pragma DATA_ALIGN(upp_buffer_b, 8). r) N* I* R3 [5 w9 W

1 e; V! k# a6 I0 c6 G, r+ T: L$ Aunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];7 o7 U1 s6 V) e6 d9 K2 ^- g! K! U
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ ~7 \$ T7 m: V: ~/ b+ K; m' ]+ ^4 H5 a
- X) g! Y! w0 K! Q, b, c: b. P
static bool server_upp_data_recv(Server *server)
! Q% f, J4 I7 m1 B+ a8 g{
0 U- l8 c2 @: I, ^! h: |    if(server->upp_channel_a_recv == false) {
# T. l" J  Y: o  @        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: T& q: a" A. U0 T* v$ [: y* ^
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {* }) V* d+ g8 o% m) y2 o) Y0 U
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
$ [3 o5 t! a: h: h" S8 Q4 s9 z" O7 G% `$ _/ o5 B$ O8 ^

  M9 l$ f2 l& u* C" ?- T# J$ |            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 I: V; R2 Q! W# v

, G" E7 d8 ~- z' q* h4 M5 q  _5 m            server->upp_channel_a_recv = true;//$ t% s2 E! Y& T* m
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* L. \" {* H8 S, k# D
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;1 I1 [( k7 S1 Q* y; b
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
  S! X1 v* _& a' S9 Q            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 R5 X- ?" S+ Z2 C9 J' |
2 U4 P  W6 W$ X' P' W' m& {' }' F/ d
            upp_error_count = 0;3 A, x& }0 {! C% T
            upp_dmai_int_cut = 0;' g( T: u6 i; k& U  W3 c1 q1 [$ P
# `/ {: {3 ]8 ^8 y7 h
            // fill in data
5 {7 ~: L, m" x2 f' L            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
  W- O& ]% I5 p9 ], P            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. O4 v4 A% _  w
        }
3 i/ j$ g* \  h; l, E    }, [' ]: R, i  l
    else{+ y3 @6 \" a7 ^) A! h
        if (upp_dmai_int_cut > 0){' B2 m. _- z6 u: E4 t  S6 O
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 a+ E& _2 n! ]5 {8 h, X
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);" Z+ q/ F4 L+ I* ^( q

4 n. i; b2 [5 o" s8 a' d/ g6 j# P* }2 v  L+ a: w( v& l5 w) E
            //copy data to upp_recv_list_busy( l5 S/ }, {7 B6 Y
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);) w; A: z7 m+ g

/ K& h, ?# Z+ ?$ {6 ?4 m            //( \: I, J9 p7 X( o4 h( S8 T
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
$ u! M$ [# a1 |# u" `$ h! J+ ]; v  Y( ?! {5 p
            //0 [1 [& H% r  @. i3 c* }" M9 m2 Y
            server->upp_channel_a_recv = false;//
/ g  v% n1 k" ^2 o& J, h1 c. S: Z  G2 A# A9 K/ f- E% n5 n
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");: M+ M& q% r4 {4 K$ U  ]  r& I
        }
' Z3 F# X; R5 p    }* \% m. \1 q. `/ o0 k+ j/ G) o& U; y

: o& ^6 L; M. T4 \$ l0 x, x. n2 |$ @6 L# x4 N. U
    return true;; o% W( L6 A6 a8 d' S
}
, j2 b8 m* a1 M+ g' n( P# E- u* l; X, Z1 q5 e9 U4 y
static bool server_upp_data_send(Server *server)
! a+ ^* W9 T) H1 J) y{
$ I* K8 b' G" Q7 n4 U    if(ListMP_empty(server->upp_send_list_busy) == FALSE){0 v; B" G& e; ^. _: H
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% h: `' t  m9 d( a3 A
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
7 f# p: A  P* f# s: ^        char tmp[128] ={0};. S# z1 ]7 ^7 v! h1 r' ]! ]# [
! Y$ Y3 }6 ^$ f  y, b" `6 C9 R7 I
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
8 U" e  |5 o* J+ i9 G3 _& a        print_log(server, data, 64);% O+ M1 S% @" X) Z( c

. x$ U: Q! j( \& J7 U+ o3 D        //- V& ^& [" [* x; n
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);! K1 I  ?6 O2 y7 A  [
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);/ r7 O, h- @! D* ^: [, ^+ F
        print_log(server, upp_buffer_b, 64);( e2 l2 E4 D3 r' e  f

2 s" j) u3 \) n, z7 h' @        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);+ t1 `0 |7 @6 G+ P  p% C
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 M' X* r" F2 k6 i% O        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" q: S$ y. y4 D* w" M/ i* T
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
, l8 D) H/ F8 B
7 i" D2 t2 b- [9 k        memset(tmp, 0, sizeof(tmp));
+ \3 j5 t8 b) X6 W        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
7 s4 R+ E5 Q1 Z9 u$ y            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
- _/ g" k8 _5 \: K7 v- b        server_msg_send(server, APP_CMD_LOG, tmp);
6 j3 R$ @) V5 `( h0 w, ^; K. G( q) t# n: b3 n( z6 Z
        upp_error_count = 0;
$ T" R- }( h- @* d5 ]- D/ m        upp_dmaq_int_cut = 0;, l# K+ _& b/ d$ `% I; j
        // fill in data
$ w( J& m* U) S/ H! Y7 k# ?, v        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 4 ]" `+ H) J$ A9 |- d
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) M0 d) x6 J+ T& ?0 x; u+ p2 j- i6 I3 M% N& V. U+ m
        // wait send success, t/ V0 n! J* v3 H' n+ M/ `: ]
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - I/ }7 K; ~: d0 }

( ?+ i) N$ T  y& ^5 ~7 ~        // make data node in free list
9 [3 P& S( L9 b1 @7 X        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ @/ c' x, J& |, W
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
% w0 V8 t! K1 G5 h4 m- Z    }
. U! s- [& c6 U" _    return true;, K. ^4 M+ H, l; C3 J$ i
}
$ f+ X) p$ j/ g
! K$ u! F4 f* x6 s0 l, M
5 O% n" ?& @3 h9 J1 N+ _
* q7 C- k+ f2 i
9 s, `, O5 P7 u5 q, x5 }

" G2 y% p# b7 t1 z$ [1 p/ ~6 U

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
8 h2 S; D: O( T8 _" B: B7 x. c* C3 t

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-18 21:13 , Processed in 0.044119 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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