138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
* g6 A* m- H3 X1 u- C, Z$ y1 A% ]1 v" o2 _; E
问题描述:$ I. p2 z3 m" a" z! F
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:2 b. x, u. D8 M0 o5 l1 \) h. E

* u7 Y+ N- k" J: E, x# _0 S图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; e8 e0 q% ]7 @, I  b' [
: }, ^1 |! N+ Y4 h5 C) t
测试结果如下:+ ]$ S/ T7 D! h0 W& r7 N
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
0 f) E/ o; B5 q7 k0 J1 i: R6 m2 S3 i/ D% q

& `$ V3 p- S/ @" {% T! C- s备注:+ _/ |1 @8 u+ ], y
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
" H6 U7 r' b4 U$ ?, G1 J5 T) p5 t% c. L
2、相关代码如下:5 `- U: r$ p9 T5 {, |
//UPP DMA缓冲大小512字节/ f/ t4 R3 y5 W3 B8 Y" `
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍( Y  ~" X% c1 j6 X" ^+ a2 B
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT" n0 ?1 s' H: L" l, Q
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
8 w5 T' n1 Z6 ]6 i
$ o# I  w: ^8 N& w
: t5 ~2 ~$ v' ?- c( C//upp接收、发送buffer* |' l6 Z9 a" r: p4 H$ Y1 l
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 F' m1 {- F# r2 E1 B3 F& a4 u" Z#pragma DATA_ALIGN(upp_buffer_b, 8)
9 e* {8 G0 C% g( n( t5 u
) s; O* |0 r# F- K2 xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
  ~6 x& H0 D* O: m7 {- i$ i; Uunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];% x4 v* Y7 [" @) O1 _9 o/ {# S: r! O
7 f0 r+ v0 y' J$ `+ Y

9 `4 B6 N8 t3 D% G% R8 U' Zstatic bool server_upp_data_recv(Server *server)
$ ]/ O+ k) Y0 J' ~+ e6 }  P{
, y9 U& m8 l( W    if(server->upp_channel_a_recv == false) {
+ |# c' v1 V& l* C1 H) P        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
9 g! r) [1 o& Y( @2 d        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 h* E$ M$ a$ z- q) X4 l& W            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");; T6 e  P9 }9 `: M+ P: t

9 V' w/ U8 b6 K
" Z! P$ W2 i" O; g8 d            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
; J+ O2 F) i3 j) v5 T( x2 R0 l. l/ U. X
            server->upp_channel_a_recv = true;//& X/ R9 x1 X4 k# h9 t2 g
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);" y& Y  R" K: a4 v( `2 Q6 [# h5 @
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;0 B  g; Y3 Y# B; O. O  Q7 Z; {
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;. E2 o% K% X( G) a
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
# d7 Q6 M! k6 n. ]0 m- s# A5 A8 s4 ^/ E! `( y
            upp_error_count = 0;/ f1 I7 C  P  S; Q
            upp_dmai_int_cut = 0;
+ X/ u9 E( V& |9 P4 E; t
5 o2 W6 C7 R. {5 d            // fill in data : H8 U0 [& \( c) \( D3 r
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
* A6 y, o) W, L/ |. t4 f2 m            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
) e  o) o* `  i3 q+ Q        }& C' W1 l( d; s! \' Z5 l9 h3 x9 t
    }
# T" V3 H0 c! E, M    else{
! h3 v: l( Q, x2 G( Q8 S3 {        if (upp_dmai_int_cut > 0){, L* G- b6 O9 l. n, f
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);7 h9 y0 s2 H* F: v
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);+ U( T6 K5 A! H1 _- M( L) q. Z

" w& ]- x1 {" t7 x4 k: Y  L- y* D7 `$ W8 o0 g. S
            //copy data to upp_recv_list_busy0 V4 `$ S  P) {5 b
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
! _% h7 A* [$ M7 w! m
! ]7 i$ f. ~+ Q( }# Q+ n            //
4 t' x+ d3 x- [8 p            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);' H, L1 t1 _2 y! y1 }1 Z! r6 b9 I! F

$ N& K) u9 e  p0 ]9 k            //
5 {8 p! ?0 S# X: f' E! E0 K$ `            server->upp_channel_a_recv = false;//
. d' ^3 P0 G! T/ U( p) v4 \! ?% V) Z3 x! J) {$ l* _9 I
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");7 Y* U  n, x6 {+ e$ o: U- X5 b
        }
3 @: @( y' Q9 R" O# M    }" F# M) \! K( e+ P
7 W, x9 x- S5 \
& C  ^5 V. J# F: @8 }+ t/ c
    return true;
# Q2 N& o+ H6 h2 R}9 m7 K0 r# {) O; ]( G9 m

1 i: M  {2 e  d; s) i: Bstatic bool server_upp_data_send(Server *server)
0 v8 {% n( G! s$ q) _" N. a{. f2 |# U$ H: W8 m4 d
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
+ f9 g! A. A7 `5 I! w4 Q9 `0 I        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
, r" t! `" Y- l" M) o6 \2 g* o        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);" m2 `5 K$ j$ \  m  q
        char tmp[128] ={0};) I% ^5 \+ G* G$ ^2 y5 @0 M% f1 E
2 O- B  _4 }6 N" H9 M$ d9 P8 h
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
1 |  h% b+ F0 z        print_log(server, data, 64);' u" s: \  v& c+ c0 S/ \5 x7 `) v
$ p! U: M; g6 }+ o
        //, g' j7 |" }5 ^6 o3 I
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);, O$ T# p& w( C* C
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);- p" x1 e( ~1 ?6 g8 B
        print_log(server, upp_buffer_b, 64);" H9 m9 M9 b) c! {2 w) Q: y
. M" Y: Y4 C; W$ ^, o1 O
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
4 A5 ~" S: |3 O9 E        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 7 z" m" b6 D3 k, r7 y7 }7 z- t7 R
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
+ i, T& c( }6 }) }, J. e1 w, I        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
. e# Q9 q0 m" z* b
# a+ @3 D& |$ E9 Y3 {  w        memset(tmp, 0, sizeof(tmp));
2 E( O+ ?( ]7 m* v$ c2 J5 T        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 2 M5 ]7 ~9 `2 ?5 O% w3 q
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
. s0 P( G1 U8 `3 r5 D, F' @3 X        server_msg_send(server, APP_CMD_LOG, tmp);; o0 E  o0 {9 s
6 F  ^: u9 Z' D
        upp_error_count = 0;
! h7 |& _! G) O" i        upp_dmaq_int_cut = 0;6 e2 S  w  E1 v
        // fill in data
. x+ t4 A( g& w) Z+ X        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);   d: ~$ A& [% p" _) s' `* L
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
8 w: p" G# p7 ~. T4 |% l2 Q$ P$ n, D1 F, O" T2 W
        // wait send success: d/ f7 [. X0 m0 r# G, ?
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
; Z/ ]- g0 p8 d  H$ d. X7 Y/ K9 e# r6 q: o/ _: T1 ~: {: l
        // make data node in free list 5 W" r- Q5 Y! z( L
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; Z' M0 u5 e( |, }* q& n4 X
        server_msg_send(server, APP_CMD_LOG, "upp send: success");4 K5 k( h+ Y1 m
    }
& R. p. ~: Q2 u0 N# K    return true;
8 H3 K' q+ Q2 _: i! q; J}  Q7 d5 q' S1 m- U
- e4 h' x! V- D( m" K5 E
% T& O  h# U) x: V  q, E
1 h& e/ t% `5 _7 ~
2 R: J. Z( `. L0 }" f" i2 z# a
( e- c/ b) u; D/ T# K) A) ?0 t

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐- p8 E6 ^( C( x5 H# X, W" X' A

+ S" U& [# G; v- e9 _7 I1 _' `

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-4 23:43 , Processed in 0.039023 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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