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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 ! K8 O9 m* A- P/ i1 b3 L$ F

$ r* c* R, {( U  y问题描述:
' w" Y% l  Q3 N$ G7 y在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 u5 V5 ~/ f% P1 u8 w% r7 w
* ?0 Z2 E+ y, E4 @" E图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* A1 w- |( Q# E7 |) z/ p4 V- ^" o
% g1 d; U! M2 Q) D) @1 h测试结果如下:
; D# @# p7 c% z6 s5 B& a; v138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
! z. U' S+ Y' ?
4 Y! ?; e" T. ]
1 ?  r+ x7 `7 f) a) t备注:0 o3 Z/ O$ i' j3 s* r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 N  V! \% M1 R. _
2、相关代码如下:- V: o  c" W- [3 t
//UPP DMA缓冲大小512字节
9 p. k+ z/ d) J; n4 i; |#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 p6 l% t% t! N#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT( y9 D1 w) E! U2 s  U5 g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
2 T# ]) f& D8 q, U; e$ ~) b. U8 |; X; l* i0 F- }! ^3 [( n, ^
% k' q( @' K" ]6 o: x) Q
//upp接收、发送buffer
( b/ ?  }4 i3 e( c' G# b#pragma DATA_ALIGN(upp_buffer_a, 8)
8 Z' k! m+ I2 [- y4 s; }% F$ J#pragma DATA_ALIGN(upp_buffer_b, 8)
1 ]  z- G) t! [
% k: k- j/ `: L6 {! q2 yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];" E. _8 x% K: y  ~
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, O7 ~1 F9 j1 p; N: m

7 @' t8 x- u' H+ m! p/ I
; p; x: G- {& i3 K7 q  Tstatic bool server_upp_data_recv(Server *server)
5 @9 f# k( @+ t4 v+ M/ j4 z{
0 Z8 U" x1 j' a( e  A& Z( o    if(server->upp_channel_a_recv == false) {4 N4 L0 N7 i5 ^! t; B. m
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");) H9 B+ @! q% v6 _4 n# _0 M& x! c
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' u* P3 _* M0 J5 F) s( q
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" l6 A% ?( j" t# f. }* N9 B
. A8 c. o0 A* N: ?+ C8 y* \; [0 E3 a" p
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);: |% X4 f; j! ]7 `$ r" W2 h
- [. Q1 @, \2 l; y
            server->upp_channel_a_recv = true;//
8 b2 C" }+ v/ {+ |            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
0 }9 R: \" |, p- D            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;( i2 _" S7 Z6 r' o2 ]
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;7 N5 T* ^' a8 V; g1 l8 d# y, k
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
4 J1 I  N  a" }( e% Z' C: B2 H2 L5 L9 q9 ]
            upp_error_count = 0;9 v' h3 \0 g  R* b3 o7 X4 E# M
            upp_dmai_int_cut = 0;
) r9 U' j! n$ ~, p0 S& q3 R& }( o, C, l/ H
            // fill in data . M9 d; g5 i8 o6 V; @! M
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);1 N  F' T. M2 l( W
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");. q' @3 ~& F  Z/ z9 m0 D  Q. l/ v
        }
7 o5 [1 N- V8 s  t2 D$ c& a    }
4 O7 c  l' ?3 x" ^* Z7 Z  q$ x    else{
/ j& L; S: B3 [5 U        if (upp_dmai_int_cut > 0){
% D- |# {9 a) ~: c" ]7 M3 e7 I            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
* e8 \" x) w# F            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);7 U, w' J/ L% o0 n' m/ W
& r5 j' U) B1 F$ u
1 E( S# t/ F" M' f( W* \
            //copy data to upp_recv_list_busy
' K7 N5 {% t! h            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
/ G% q6 s" I  g
+ r  _' o) R; ^, E            //
- X$ L+ U4 U; y9 _* K9 f0 u            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 B1 x" e6 S+ B0 Q5 i# W8 F  B
' |3 ]2 u/ E2 B/ @, w* v1 {- {& ^
            //6 J6 G+ @  h, v+ h$ J
            server->upp_channel_a_recv = false;//
- L; S& T  d( k# y2 h0 `/ c& @1 Z! z6 W8 q6 O0 j6 G" X3 Z* Q9 k  C
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");6 _1 B3 \* L0 f
        }
7 c6 G% O% }$ `# K    }( h. l; T3 U- `

. o( a3 o4 p1 n4 h# [, g+ D2 H* s8 B$ w. ^3 ?. k% W
    return true;
9 @' v, `$ d  C/ e  \4 Y: W7 k}
7 Z7 T" c* P+ J+ Q6 L% Y4 h* }+ o0 N! W; O4 ~4 \
static bool server_upp_data_send(Server *server)
" g1 t6 E% x0 Y{+ ]+ L6 q5 _# {3 b
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
! p5 @& B) Y5 t& w        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
( d$ |$ d0 }9 _+ O! y/ c        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);% K! a% t+ I% ]0 @9 t* D: ]
        char tmp[128] ={0};
% r6 |8 m9 F% j
. P6 D2 Q% a7 j: K  r        server_msg_send(server, APP_CMD_LOG, "upp send: start");+ v( g+ w) a& a6 P* p7 _
        print_log(server, data, 64);  r! u9 {3 ~0 d4 q' P
+ q* i4 ^2 m1 m0 k6 I" `
        //
6 X: B% r6 e" Z/ X        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);1 `4 t. f2 v1 f' z" D. E
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);# [/ L2 [# N( [0 `: `
        print_log(server, upp_buffer_b, 64);- d' p* K6 T# _

# Z3 H; Z. a9 n) P6 t- B* E        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
$ ?$ ?( Y2 b. W6 ^* ^) w        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
: I. }& U; W5 o/ A" X        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! R( N, \4 O. Z4 t2 F
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& d7 L+ G% t+ F$ X2 C
9 h! K2 T5 f$ j5 u: q* }: k
        memset(tmp, 0, sizeof(tmp));
- i' m. \+ L* U* G% l7 c! S        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) q) {  W: h& n( u! a8 v            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! A; {% L; n% l9 G, g& ^        server_msg_send(server, APP_CMD_LOG, tmp);* r9 l5 d6 @* d  g/ m/ m7 h

8 q# C8 o0 L; {5 @0 W6 ^        upp_error_count = 0;
$ z, k- R2 W& n/ E        upp_dmaq_int_cut = 0;
* n- a( Z7 h- L3 w$ f        // fill in data . ^7 m4 \3 s$ t: y: l2 `
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # i0 o+ I, L; b
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
' Z3 P. Y& ]3 V9 `- x
* b5 S- A2 U6 @) S        // wait send success, {% X; u& [  O) p, S+ G
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
* b: v0 p4 t* P6 ~5 A  B0 w
$ z5 y: I/ _! ^' k) k7 m        // make data node in free list
9 {7 a& U0 ?# N8 p: H        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 w/ E: e  M2 V- t# j3 d! q
        server_msg_send(server, APP_CMD_LOG, "upp send: success");  L$ @! T- A6 K) j6 ^* u2 _. M" M
    }
7 k  z' N& M' b1 ]2 e0 H    return true;
6 j3 D& X, q1 z# e- b}3 }4 c4 W# t0 c' \

; D; q' N; B+ h5 J. ]8 F

: R) @* r- H3 X6 x" B' f# c  O- S1 G# t2 x' F( M

+ S6 F$ y- F& t3 h
7 W, A" U" J  [, W+ T

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
- u3 [/ @7 W; a! p0 {: m9 Y2 O1 V* X+ h: z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 20:16 , Processed in 0.044801 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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