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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 U: j+ C( j; j- D! Y0 l4 N  U$ u) C8 E5 x7 W. i
问题描述:
+ l: Q' v' q1 `" t2 T4 Y; _2 k4 B在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' T) B. a0 Z& B% r
; Y- i4 z! a5 B) b7 n" J图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* L- X& ]' L6 z1 _/ t
) K. D5 j* J* N测试结果如下:( f. {6 f% F# X8 w8 E* b/ Q4 D* m
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
1 v& a6 I9 p, t" U) w
; _9 H6 K+ ?& J
) a# H, o( a+ e5 J5 g备注:0 e+ E6 B+ Q. g/ j( |
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?: w3 C: g* `4 t: x3 e. C' b
2、相关代码如下:
3 v. Y  l) Z/ k8 P//UPP DMA缓冲大小512字节- ?+ M9 ?2 g' C, s. M
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. X/ T- m! O) r+ b# w#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: E, v8 @4 b# g8 ?" [$ g
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- k* B6 ]& l+ y8 W  F, N7 H9 n& y9 I2 R5 \+ Q

+ _+ X! W0 ~# {//upp接收、发送buffer$ ^/ I& E8 A6 c9 u; q
#pragma DATA_ALIGN(upp_buffer_a, 8)
1 E3 z% o6 C6 {#pragma DATA_ALIGN(upp_buffer_b, 8)4 F, X$ d1 y) U) b) D7 u

% o% T: ?5 y) W9 |+ xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ [8 N5 E7 x( U# h- I" funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
8 d) x) P  b5 B9 n" n: y$ a6 D3 X- X, q5 J2 i3 r& c$ u; m

- o7 f+ R% ?; A7 n! xstatic bool server_upp_data_recv(Server *server)
& L$ u8 C; G1 L{
& O) Y. A, M- X: N3 o! \    if(server->upp_channel_a_recv == false) {: I: r: [4 G  V; a6 v
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
8 R! ~, W* o! N) u4 R7 u$ o        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
, X) Q0 \8 L7 m: q: }2 W            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
& I  V% q6 `( F- U* a3 A3 S. c* e- L1 ]2 Z9 y" H/ i

9 f7 Q- v" ?! }* z            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
7 N7 `* g& C5 f  h! [" `# d6 E. w- H( s
            server->upp_channel_a_recv = true;//  t: h, C3 S/ y: H2 ]& P
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* l0 {* D( R$ V2 A/ @8 r) {$ c8 B
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  U/ ^- S6 c  h; \0 A: a            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;* _! Q! Y" F6 o4 ]# E) a* _
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//8 p0 u: p& y% Z+ Y% G% X. N; z
8 s+ k# z' r3 m3 z4 K8 {
            upp_error_count = 0;* j+ b- E# j/ F6 t  D1 q# `
            upp_dmai_int_cut = 0;
; W7 v% {" `7 @9 c# d0 m
! ^' O; T. t4 _' I* Y  I/ E            // fill in data
# z- R' p: b$ [( V            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);, v. Y* d2 I( l( u) B2 s) V+ b$ P
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
3 k* ]  u8 v1 N9 a) q) G5 U        }
  ~5 v$ n  _% c. i( }% h  _5 c    }0 t* l) o0 x) q& V! v" M
    else{
! }# C6 Z: N7 m8 n; d% `2 _: }        if (upp_dmai_int_cut > 0){3 P' i9 I6 m: _- g" _) T% v
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
+ x* @$ s. H6 w. X            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 Y/ o# a# D4 p- O3 g! z
: {0 i; W$ y- \' ~' a+ U
' i5 D% Z) L8 S! {2 U: J            //copy data to upp_recv_list_busy' T$ V8 m" y) H3 E' e
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
: T+ c9 O  ~2 ~7 n+ _( j9 s# w4 G! P' _
            //) o4 g2 W; p9 _: [5 T2 u( V
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
! C9 L& {: j9 q: a2 \6 Y
6 n) x6 N4 r8 ?6 G0 {3 c- ]& O+ \            //
  V! F' \7 v& |& F1 q( H* B) {& d            server->upp_channel_a_recv = false;//' w, n" N. d! b: n& p2 s( ^
3 \/ V& `4 a/ @, H3 V1 b
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");- F$ P- k% v3 A
        }
$ Z5 B- D1 e2 q; A7 ?/ c+ H+ E    }1 _1 E, Z1 D4 B: |, Y) H
1 A1 W- D0 F9 D+ d1 y
2 r8 e$ B! H' \1 |
    return true;
0 c0 g- F: `6 k* t5 w}
$ m& B0 B. Z2 u5 a9 Z
9 V- B  v, F. F2 H; o1 Gstatic bool server_upp_data_send(Server *server)3 x( T6 j$ Z$ F8 i6 T( ~- [
{3 `7 a5 b/ F6 C+ ^
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){: R; R! p6 f/ f1 i
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);3 G& G5 A0 T* z7 A
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);1 r5 i7 m5 L; E4 Y9 s1 ?
        char tmp[128] ={0};% W6 a- D0 f9 F+ E  V4 a

8 v# @0 W& o9 a        server_msg_send(server, APP_CMD_LOG, "upp send: start");
' v  z/ j/ G1 l8 ?  F# ~        print_log(server, data, 64);' l8 j! [! g. {
- D9 _0 ^3 ^8 c' p: N& g# _/ H* v# @
        //; b: y6 F5 d' ?/ Z* E# d
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);6 M5 W- w$ u# R2 c; Q1 t  |
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);& l* d' f# Q! K+ N3 C
        print_log(server, upp_buffer_b, 64);; L. Q; J8 y2 {+ x

' i/ I. q) v, \% V        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);# ^1 J+ L4 }8 |' d
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 v; b7 P/ k8 x) \        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
4 s4 R* l9 B4 ~- Q        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
3 I% c& y* q  q4 y+ B; c9 ^# a$ Y$ }4 g# w* g" D! Z8 i/ G
        memset(tmp, 0, sizeof(tmp));
% l9 p* C  B) j  _8 s        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
4 |2 A0 @8 S9 n  M/ ^            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
  b: y0 T* i8 u: {( I        server_msg_send(server, APP_CMD_LOG, tmp);7 P# }' T# U1 l9 i7 I

& Z. ?2 [" d1 f+ a! L6 G5 c        upp_error_count = 0;) e  `7 j# Z# q. |- [
        upp_dmaq_int_cut = 0;
+ J  D2 k8 M$ Y$ _1 l# p        // fill in data - e% R, [, j3 n  y7 M$ w. d
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 7 W/ a/ j, t+ w
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
5 F$ a' G" s. v$ t1 X
: e* q3 H! H% w- `4 j- V        // wait send success
1 E+ {' ^: y' X' K9 A        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); , f* c/ s6 ]" _! n3 z, A: z$ {

/ I  D# Y9 h" Z9 ?! t9 B' l  m) p        // make data node in free list
& P& a% W8 S( V; d        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);6 `. B9 D$ @! R3 k
        server_msg_send(server, APP_CMD_LOG, "upp send: success");; Q& S8 A- o2 ?1 N3 J" Z
    }2 p" N6 n2 i: D
    return true;
# l( Q* Q% O/ u" m}
5 L8 a, N% V& }9 s& \: Z% U5 X. ~* p) |1 o: _' T  J2 [/ @& k

& f/ c3 C+ p, ?9 g
# L4 P3 j# ]- R0 g8 F, k

# Y: ~+ X$ s  j" s$ t4 m
5 [! a8 j' `: O

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
' ?% B0 k- d' j1 C/ X
& B6 f7 `9 Q( C5 r8 w2 C

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 03:47 , Processed in 0.048553 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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