⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vidc_fill.s

📁 arm平台上的uclinux系统全部源代码
💻 S
字号:
/* * sound/vidc_fill.S * * Filler routines for DMA buffers * * Copyright (C) 1997 Russell King */#include <asm/assembler.h>#include <asm/hardware.h>		.text		.globl	_vidc_fill_1x8_u_vidc_fill_1x8_u:		mov	ip, #0xff001:		cmp	r0, r1		bge	_vidc_clear		ldrb	r4, [r0], #1		eor	r4, r4, #0x80		and	r4, ip, r4, lsl #8		orr	r4, r4, r4, lsl #16		str	r4, [r2], #4		cmp	r2, r3		blt	1b		mov	pc, lr		.globl	_vidc_fill_2x8_u_vidc_fill_2x8_u:		mov	ip, #0xff001:		cmp	r0, r1		bge	_vidc_clear		ldr	r4, [r0], #2		and	r5, r4, ip		and	r4, ip, r4, lsl #8		orr	r4, r4, r5, lsl #16		orr	r4, r4, r4, lsr #8		str	r4, [r2], #4		cmp	r2, r3		blt	1b		mov	pc, lr		.globl	_vidc_fill_1x8_s_vidc_fill_1x8_s:		mov	ip, #0xff001:		cmp	r0, r1		bge	_vidc_clear		ldrb	r4, [r0], #1		and	r4, ip, r4, lsl #8		orr	r4, r4, r4, lsl #16		str	r4, [r2], #4		cmp	r2, r3		blt	1b		mov	pc, lr		.globl	_vidc_fill_2x8_s_vidc_fill_2x8_s:		mov	ip, #0xff001:		cmp	r0, r1		bge	_vidc_clear		ldr	r4, [r0], #2		and	r5, r4, ip		and	r4, ip, r4, lsl #8		orr	r4, r4, r5, lsl #16		orr	r4, r4, r4, lsr #8		str	r4, [r2], #4		cmp	r2, r3		blt	1b		mov	pc, lr		.globl	_vidc_fill_1x16_s_vidc_fill_1x16_s:		mov	ip, #0xff00		orr	ip, ip, ip, lsr #81:		cmp	r0, r1		bge	_vidc_clear		ldr	r5, [r0], #2		and	r4, r5, ip		orr	r4, r4, r4, lsl #16		str	r4, [r2], #4		cmp	r0, r1		addlt	r0, r0, #2		andlt	r4, r5, ip, lsl #16		orrlt	r4, r4, r4, lsr #16		strlt	r4, [r2], #4		cmp	r2, r3		blt	1b		mov	pc, lr		.globl	_vidc_fill_2x16_s_vidc_fill_2x16_s:		mov	ip, #0xff00		orr	ip, ip, ip, lsr #81:		cmp	r0, r1		bge	_vidc_clear		ldr	r4, [r0], #4		str	r4, [r2], #4		cmp	r0, r1		ldrlt	r4, [r0], #4		strlt	r4, [r2], #4		cmp	r2, r3		blt	1b		mov	pc, lr_vidc_fill_noaudio:		mov	r0, #0		mov	r1, #02:		mov	r4, #0		mov	r5, #01:		cmp	r2, r3		stmltia	r2!, {r0, r1, r4, r5}		blt	1b		mov	pc, lr_vidc_clear:	mov	r0, #0		mov	r1, #0		tst	r2, #4		str	r0, [r2], #4		tst	r2, #8		stmia	r2!, {r0, r1}		b	2b/* * Call filler routines with: *  r0 = phys address *  r1 = phys end *  r2 = buffer * Returns: *  r0 = new buffer address *  r2 = new buffer finish *  r4 = corrupted *  r5 = corrupted *  ip = corrupted */		.globl	_vidc_sound_dma_irq_vidc_sound_dma_irq:		stmfd	sp!, {r4 - r9, lr}		ldr	r9, =_dma_start		ldmia	r9, {r0, r1, r2, r3, r4, r5}		teq	r1, #0		adreq	r4, _vidc_fill_noaudio		moveq	r8, #1 << 31		movne	r8, #0		mov	ip, #IOMD_BASE & 0xff000000		orr	ip, ip, #IOMD_BASE & 0x00ff0000		ldrb	r7, [ip, #IOMD_SD0ST]		tst	r7, #DMA_ST_OFL			@ Check for overrun		eorne	r7, r7, #DMA_ST_AB		tst	r7, #DMA_ST_AB		moveq	r2, r3				@ DMAing A, update B		add	r3, r2, r5			@ End of DMA buffer		add	r1, r1, r0			@ End of virtual DMA buffer		mov	lr, pc		mov	pc, r4				@ Call fill routine		sub	r1, r1, r0			@ Remaining length		stmia	r9, {r0, r1}		mov	r0, #0		tst	r2, #4				@ Round buffer up to 4 words		strne	r0, [r2], #4		tst	r2, #8		strne	r0, [r2], #4		strne	r0, [r2], #4		sub	r2, r2, #16		mov	r2, r2, lsl #20		movs	r2, r2, lsr #20		orreq	r2, r2, #1 << 30		@ Set L bit		orr	r2, r2, r8		ldmdb	r9, {r3, r4, r5}		tst	r7, #DMA_ST_AB		mov	ip, #IOMD_BASE & 0xff000000		orr	ip, ip, #IOMD_BASE & 0x00ff0000		streq	r4, [ip, #IOMD_SD0CURB]		strne	r5, [ip, #IOMD_SD0CURA]		streq	r2, [ip, #IOMD_SD0ENDB]		strne	r2, [ip, #IOMD_SD0ENDA]		ldr	r6, [ip, #IOMD_SD0ST]		tst	r6, #DMA_ST_OFL		bne	1f		tst	r7, #DMA_ST_AB		strne	r4, [ip, #IOMD_SD0CURB]		streq	r5, [ip, #IOMD_SD0CURA]		strne	r2, [ip, #IOMD_SD0ENDB]		streq	r2, [ip, #IOMD_SD0ENDA]1:		teq	r8, #0		mov	r0, #0x10		strneb	r0, [ip, #IOMD_SD0CR]		teqeq	r1, #0		ldmfd	sp!, {r4 - r9, lr}		moveq	pc, r3				@ Call interrupt routine		mov	pc, lr		.data		.globl	_dma_interrupt_dma_interrupt:	.long	0		.globl	_dma_pbuf_dma_pbuf:	.long	0		.long	0		.globl	_dma_start_dma_start:	.long	0		.globl	_dma_count_dma_count:	.long	0		.globl	_dma_buf_dma_buf:	.long	0		.long	0		.globl	_vidc_filler_vidc_filler:	.long	_vidc_fill_noaudio		.globl	_dma_bufsize_dma_bufsize:	.long	0x1000

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -