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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
- A( ^5 L! \( ~% b+ u# Z+ d6 b" j
4 F+ W) u/ q+ ~问题描述:/ `9 Q4 S. g/ m
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
* s" s) y1 _8 o
7 `) v9 p( Y8 z5 |3 K* Y" S' D图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。  i% V: {, Q6 ^9 o' \

; c! s8 p2 R* i6 C. Y9 F, c测试结果如下:  T' C$ p0 i+ U1 `0 g8 V6 r# A! p
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?/ c3 o! U5 N3 z% W# U
. Q5 S$ w, R( |' z

- B" T* X8 e, F% Z9 S9 x8 H& H$ _备注:3 J" j4 k/ Q% s+ {
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
+ V9 c% D$ K) D6 k- e+ }6 ?
2、相关代码如下:  j# {) q* v8 A/ r; E" V/ e! v9 S
//UPP DMA缓冲大小512字节
3 F. B* }7 s! H; D! t/ F" B#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
1 g7 Q! h) F/ w2 p" ?#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
' A) R) N+ n9 B2 V#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
( ?  c0 U  V! _1 I, O4 P" f6 c
9 Q2 V, @' ^4 g" _+ |% p' U6 [  W/ f9 m2 U$ k% ]
//upp接收、发送buffer
2 Q! e% B& w! }4 m#pragma DATA_ALIGN(upp_buffer_a, 8)8 [2 v9 N$ P3 E% U& E
#pragma DATA_ALIGN(upp_buffer_b, 8)! D3 d1 t2 |0 O& R( m5 _

6 V' d) O. C# z6 C; qunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' ?. A) b$ v; y# e
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 ]& Q& `8 Q4 W4 @' j
7 z$ t( h- r: p$ z+ R- l
$ d' f( b6 {2 T! Dstatic bool server_upp_data_recv(Server *server)
4 [1 [3 e2 a* m( V{6 n1 u) L. D- [0 s  {
    if(server->upp_channel_a_recv == false) {
" ~, S) W/ u/ h) I. [        server_msg_send(server, APP_CMD_LOG, "upp recv: start");* `! b" R4 y* p5 M% Z/ A! ~( Q3 q, s
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 g1 c# Y* K/ t! |5 D3 j) J8 o! Z2 {
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
1 |1 w: R3 e* F% h
: T% h' g" Q/ p4 {/ T9 x& b  h8 z1 q, m& x; [
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);5 i1 r" {! i$ j+ ^$ I, b
1 o" |" L2 U- A
            server->upp_channel_a_recv = true;//
1 ?: Q' R1 R7 Q* p            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
7 Q8 I8 b, u5 J5 L8 Y            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;/ b' R8 N3 {2 d
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
. T! c% V" H1 y3 a. T7 A            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 _  ?! j. @) n1 u6 N
4 v6 G- E) G+ {+ k# a2 o
            upp_error_count = 0;& C4 b/ q4 r+ o- G! T( O% g
            upp_dmai_int_cut = 0;
5 x( g2 \- \* i& J% t& \& M+ R% }. F2 d& ~9 N# C# d
            // fill in data 9 t, {& `9 r% B
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
2 U8 d" E2 q8 V  \: k            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");9 S+ b# D) N; K4 `
        }2 L3 j1 o/ I% Y
    }/ ^; d/ w" e5 A1 C# n" ^4 f
    else{
4 A9 a9 a# p& Q* z! w% J& z9 W3 ]        if (upp_dmai_int_cut > 0){8 w" p" v; p& Y; k
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ D& t1 R9 G  _5 z. f- ]            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
+ w6 [- s2 U6 e! `9 X8 G, Y0 g) b' C# j/ z) [
, r. N( @4 R. r" A' Y5 c  w: Z
            //copy data to upp_recv_list_busy/ z" P* C/ v0 `1 w1 T1 x
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 P( C$ D" D" g0 I8 Y3 O3 U
* y3 j& K  F  k8 d0 v            //
( {- j- U2 o/ T' C( t5 x. i; n& D            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  o5 u5 H5 u! J* a& L) \. m  H
' q! m: c1 U8 K$ O2 L, L( D            //
4 O' Y8 L2 t4 N  l            server->upp_channel_a_recv = false;//
9 ]7 ]; t5 Q1 I# m; U8 {4 b1 J3 V, T& r- z/ y; Y2 i, [4 {8 s
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
4 n; K! I" z" z# R        }
. h- L3 C$ @) X    }
9 ~9 z- n; g; g' |
% w8 ]( W! ?$ c/ E; S3 i- L; s3 ^( ~( y7 U# a
    return true;
  v. U2 X, N, c8 f}
$ w1 R6 l3 f7 W/ [
6 U; N0 i# L- @0 \4 W8 J. a3 O+ Ostatic bool server_upp_data_send(Server *server): Y" o2 [) U7 p( G0 l0 A2 }
{: }# F3 O+ y& e& i; a2 x
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" }+ |( h/ ]) _' G' @  K        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
- ]* t* E$ B. ?3 F7 _        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
# {) c# G% U! C1 q        char tmp[128] ={0};
: ~6 R/ ]8 L1 r/ s4 C& A% @
* N. z4 J6 F  {7 B, a        server_msg_send(server, APP_CMD_LOG, "upp send: start");
" |9 ?" F8 }8 `6 P        print_log(server, data, 64);
" C; v3 C/ f& Y$ w4 R! p1 X; g1 |, }' L+ Z: e- \! w  r$ u
        //$ `8 q$ X& s4 S) V; c$ B( Q
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);# F* a4 d7 d3 W2 B* |
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! g: {1 A9 ]# t& i7 y3 Q' g        print_log(server, upp_buffer_b, 64);* r5 l5 V4 A) G- }1 z
) l2 o8 K$ I, a% D
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
1 E1 o2 m/ H) P/ }) Z" k; w; Z; D        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) Y/ l* g4 R. `0 \3 p
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
7 J: [, N5 v! E; J2 n# d6 r5 J% w        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; A( X& p0 b% u2 q: G0 U$ u, ?

! F' l  `" Z# ?        memset(tmp, 0, sizeof(tmp));
) y4 K, a$ Q8 ?6 g        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
% h1 W6 j; O+ e/ Y( `0 B' W            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
" h8 v$ m2 X+ r# q) l2 Z8 y        server_msg_send(server, APP_CMD_LOG, tmp);. L  A3 r2 X' H4 m! K- [3 L

3 q) S3 }. k4 l6 d4 ?% q" i        upp_error_count = 0;
0 K8 ~( P. q6 |        upp_dmaq_int_cut = 0;
& c9 d& ~% r% h- W% b! q        // fill in data ( x6 y; _, E1 ^+ s8 `  u, G3 @1 _9 T
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
- E$ o/ t# e" r0 B        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");/ J$ w8 \# O6 C- K$ {0 I

2 ^  T/ @4 S2 I! B+ N        // wait send success7 P" {4 S" _% i5 k' q/ {. j
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ b/ r1 g' J  h8 y# `$ T; R" x9 p; @) B5 Y/ {+ B6 o: @8 k8 O
        // make data node in free list
4 z3 _! t' o  ~2 E6 D        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
+ S9 O# f+ P. P$ F9 m' i5 v        server_msg_send(server, APP_CMD_LOG, "upp send: success");
4 x- X. o; A8 y( ]4 c    }* B; |; q# Z' j7 R0 ^1 V
    return true;7 J( g: S: [: F1 T  q+ o8 O
}
6 k8 ~7 \8 G* r) f; {. O; p* ~" W0 E0 P* Z# q( T6 U

$ Y1 o" @2 p2 b0 `( _* H4 R0 N) Z# R4 n+ k
% v: h; E. y/ s  f7 I3 t9 r# n

# ^; S7 O" }/ `

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
, q# W0 U" Q( k8 R; g* l' j$ E' k

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 15:54 , Processed in 0.059755 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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