예제 #1
0
static int __devinit galaxy_init(struct snd_galaxy *galaxy, u8 *type)
{
    u8 major;
    u8 minor;
    int err;

    err = dsp_reset(galaxy->port);
    if (err < 0)
        return err;

    err = dsp_get_version(galaxy->port, &major, &minor);
    if (err < 0)
        return err;

    if (major != GALAXY_DSP_MAJOR || minor != GALAXY_DSP_MINOR)
        return -ENODEV;

    err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_8);
    if (err < 0)
        return err;

    err = dsp_command(galaxy->port, GALAXY_COMMAND_GET_TYPE);
    if (err < 0)
        return err;

    err = dsp_get_byte(galaxy->port, type);
    if (err < 0)
        return err;

    return 0;
}
int YARPMEIDeviceDriver::open(void *d)
{
	// temporarily removed
	int16 rc = 0;

	MEIOpenParameters *p = (MEIOpenParameters *)d;

	_njoints = p->nj;

	rc = dsp_init(p->meiPortAddr);	// init
	rc = dsp_reset();				// reset

	_ref_speeds = new double [_njoints];
	ACE_ASSERT (_ref_speeds != NULL);
	_ref_accs = new double [_njoints];
	ACE_ASSERT (_ref_accs != NULL);
	_ref_positions = new double [_njoints];
	ACE_ASSERT (_ref_positions != NULL);
	_all_axes = new int16[_njoints];
	ACE_ASSERT (_all_axes != NULL);

	int i;
	for(i = 0; i < _njoints; i++)
		_all_axes[i] = i;

	_filter_coeffs = new int16* [_njoints];
	ACE_ASSERT (_filter_coeffs != NULL);
	for(i = 0; i < _njoints; i++)
	{
		_filter_coeffs[i] = new int16 [COEFFICIENTS];
		ACE_ASSERT (_filter_coeffs[i] != NULL);
	}

	_dsp_rate = dsp_sample_rate();
	
	_winding = new int16[_njoints];
	ACE_ASSERT (_winding != NULL);
	memset (_winding, 0, sizeof(int16) * _njoints);

	_16bit_oldpos = new double[_njoints];
	ACE_ASSERT (_16bit_oldpos != NULL);
	memset (_16bit_oldpos, 0, sizeof(double) * _njoints);

	_position_zero = new double[_njoints];
	ACE_ASSERT (_position_zero != NULL);
	memset (_position_zero, 0, sizeof(double) * _njoints);

	int mask = p->ioPorts;
	for (i = 0; i < MAX_PORTS; i++)
	{
		if (mask & 0x1)
			init_io (i, IO_OUTPUT);
		else
			init_io (i, IO_INPUT);

		mask >>= 1;
	}

	return rc;
}
예제 #3
0
파일: pcm-mr500.c 프로젝트: Megaco/rockbox
void pcm_play_dma_init(void)
{
    IO_INTC_IRQ0 = 1 << 11;
    IO_INTC_EINT0 |= 1 << 11;
    
    IO_DSPC_HPIB_CONTROL = 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7 | 1 << 3 | 1 << 0;
    
    dsp_reset();
    dsp_load(dsp_image);
    dsp_wake();
}
예제 #4
0
static struct file *dsp_alloc()
{
	struct dsp_file *f = (struct dsp_file *)kmalloc(sizeof(struct dsp_file));
	file_init(&f->custom_file.base_file, &dsp_ops, O_LARGEFILE | O_RDWR);
	virtualfs_init_custom(f, &dsp_desc);
	f->waveout = NULL;
	SECURITY_ATTRIBUTES attr;
	attr.nLength = sizeof(SECURITY_ATTRIBUTES);
	attr.bInheritHandle = FALSE;
	attr.lpSecurityDescriptor = NULL;
	for (int i = 0; i < DSP_BUFFER_COUNT; i++)
		f->buffer[i].event = CreateEventW(&attr, FALSE, TRUE, NULL);
	dsp_reset(f);
	return (struct file *)f;
}
예제 #5
0
static int dsp_close(struct file *f)
{
	struct dsp_file *dsp = (struct dsp_file *)f;
	/* Send remaining buffer */
	if (dsp->buffer[dsp->current_buffer].buffer_pos < dsp->buffer_size)
	{
		dsp->buffer[dsp->current_buffer].hdr.dwBufferLength = dsp->buffer[dsp->current_buffer].buffer_pos;
		dsp_send_buffer(dsp->waveout, &dsp->buffer[dsp->current_buffer]);
		/* Wait for playback */
		WaitForSingleObject(dsp->buffer[dsp->current_buffer].event, INFINITE);
	}
	dsp_reset(dsp);
	kfree(dsp, sizeof(struct dsp_file));
	return 0;
}
예제 #6
0
static int __devinit galaxy_set_mode(struct snd_galaxy *galaxy, u8 mode)
{
    int err;

    err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_9);
    if (err < 0)
        return err;

    err = dsp_command(galaxy->port, mode);
    if (err < 0)
        return err;

#ifdef AZT1605
    err = dsp_reset(galaxy->port);
    if (err < 0)
        return err;
#endif

    return 0;
}
void pcm_play_dma_init(void)
{
    IO_INTC_IRQ0 = INTR_IRQ0_IMGBUF;
    bitset16(&IO_INTC_EINT0, INTR_EINT0_IMGBUF);
    
    /* Set this as a FIQ */
    bitset16(&IO_INTC_FISEL0, INTR_EINT0_IMGBUF);
    
    /* Enable the HPIB clock */
    bitset16(&IO_CLK_MOD0, (CLK_MOD0_HPIB | CLK_MOD0_DSP));

    IO_SDRAM_SDDMASEL = 0x24;

    IO_DSPC_HPIB_CONTROL = 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7 | 1 << 3 | 1 << 0;
    
    dsp_reset();
    dsp_load(dsp_image);

    DSP_(_dma0_stopped)=1;
    dsp_wake();
}
int dsp_open(struct inode *inode, struct file *file)
{
	if (dsp_iopage) return 0;

/*	if (GPLR & GPIO_GPIO(1)) { OLD */
	if (GPLR(0) & GPIO_bit(1)) {   
		printk("btweb: no DSP device found, continuing anyways\n");
		return -ENODEV;
	}
	
	dsp_iopage = (unsigned short *)ioremap(0x20000000, PAGE_SIZE);
	if (!dsp_iopage) {
		printk("btweb: ioremap failed\n");
		return -ENODEV;
	}

  /* first open, force a reset */
	dsp_reset(inode, file, 0, 0);
	
  return 0;

}
예제 #9
0
파일: galaxy.c 프로젝트: 454053205/linux
static int __devinit galaxy_set_mode(struct snd_galaxy *galaxy, u8 mode)
{
	int err;

	err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_9);
	if (err < 0)
		return err;

	err = dsp_command(galaxy->port, mode);
	if (err < 0)
		return err;

#ifdef AZT1605
	/*
	 * Needed for MPU IRQ on AZT1605, but AZT2316 loses WSS again
	 */
	err = dsp_reset(galaxy->port);
	if (err < 0)
		return err;
#endif

	return 0;
}
예제 #10
0
파일: main.c 프로젝트: lewurm/ppcskel
int main(void)
{
	int vmode = -1;
	exception_init();
	dsp_reset();

	irq_initialize();
	irq_bw_enable(BW_PI_IRQ_RESET);
	irq_bw_enable(BW_PI_IRQ_HW); //hollywood pic
	/* external ohci */
	irq_hw_enable(IRQ_OHCI0);
	/* internal ohci */
	//irq_hw_enable(IRQ_OHCI1);

	ipc_initialize();
	ipc_slowping();

	gecko_init();
    input_init();
	init_fb(vmode);

	VIDEO_Init(vmode);
	VIDEO_SetFrameBuffer(get_xfb());
	VISetupEncoder();

	u32 version = ipc_getvers();
	u16 mini_version_major = version >> 16 & 0xFFFF;
	u16 mini_version_minor = version & 0xFFFF;
	printf("Mini version: %d.%0d\n", mini_version_major, mini_version_minor);

	if (version < MINIMUM_MINI_VERSION) {
		printf("Sorry, this version of MINI (armboot.bin)\n"
			"is too old, please update to at least %d.%0d.\n", 
			(MINIMUM_MINI_VERSION >> 16), (MINIMUM_MINI_VERSION & 0xFFFF));
		for (;;) 
			; // better ideas welcome!
	}
예제 #11
0
파일: main.c 프로젝트: 4nh51rk/mailboxbomb
int main(void)
{
	// slot LED
	write32(0xcd8000c0, 0x20);

	dsp_reset();

	exception_init();

	// Install trampoline at 80001800; some payloads like to jump
	// there to restart.  Sometimes this can even work.
	//memcpy(trampoline_buffer, reboot_trampoline, sizeof(reboot_trampoline));

	// Clear interrupt mask.
	write32(0x0c003004, 0);

	// Unlock EXI.
	write32(0x0d00643c, 0);

	video_init();
	usbgecko_init();

	printf("savezelda\n%s\n", version);

	printf("\n");
	printf("Copyright 2008,2009  Segher Boessenkool\n");
	printf("Copyright 2008  Haxx Enterprises\n");
	printf("Copyright 2008  Hector Martin (\"marcan\")\n");
	printf("Copyright 2003,2004  Felix Domke\n");
	printf("\n");
	printf("This code is licensed to you under the terms of the\n");
	printf("GNU GPL, version 2; see the file COPYING\n");
	printf("\n");
	printf("Font and graphics by Freddy Leitner\n");
	printf("\n");
	printf("\n");

	printf("Cleaning up environment... ");

	reset_ios();

	printf("OK.\n");


	int err;

 restart:
	err = try_sd_load();

	if (err) {
		err = try_usbgecko_load();

		if (err) {
			printf("No code found to load, hanging.\n");
			for (;;)
				;
		}
	}

	if (valid_elf_image(code_buffer)) {
		printf("Valid ELF image detected.\n");
		void (*entry)() = load_elf_image(code_buffer);
		entry();
		printf("Program returned to loader, reloading.\n");
	} else
		printf("No valid ELF image detected, retrying.\n");

	goto restart;
}
예제 #12
0
static int dsp_regwrite(unsigned short cmd_l, unsigned short adr,
			unsigned short val)
{
	struct mbcmd mb;
	struct mb_exarg arg = {
		.tid  = OMAP_DSP_TID_ANON,
		.argc = 1,
		.argv = &val,
	};

	mbcmd_set(mb, MBCMD(REGRW), cmd_l, adr);
	dsp_mbsend_exarg(&mb, &arg);
	return 0;
}

static int dsp_getvar(unsigned char varid, unsigned short *val, int sz)
{
	struct mbcmd mb;
	int ret = 0;

	if (down_interruptible(&ioctl_sem))
		return -ERESTARTSYS;

	ioctl_wait_cmd = MBCMD(GETVAR);
	mbcmd_set(mb, MBCMD(GETVAR), varid, 0);
	dsp_mbsend_and_wait(&mb, &ioctl_wait_q);

	if (ioctl_wait_cmd != 0) {
		printk(KERN_ERR "omapdsp: variable read error!\n");
		ret = -EINVAL;
		goto up_out;
	}

	memcpy(val, varread_val, sz * sizeof(short));

up_out:
	up(&ioctl_sem);
	return ret;
}

static int dsp_setvar(unsigned char varid, unsigned short val)
{
	struct mbcmd mb;

	mbcmd_set(mb, MBCMD(SETVAR), varid, val);
	dsp_mbsend(&mb);
	return 0;
}

static int dspcfg(void)
{
	struct mbcmd mb;
	int ret = 0;

	if (down_interruptible(&ioctl_sem))
		return -ERESTARTSYS;

	if (cfgstat != CFG_ERR) {
		printk(KERN_ERR
		       "omapdsp: DSP has been already configured. "
		       "do unconfig!\n");
		ret = -EBUSY;
		goto up_out;
	}

	dsp_mb_start();
	dsp_twch_start();
	dsp_mem_start();
	dsp_err_start();

	mbx_revision = -1;
	ioctl_wait_cmd = MBCMD(DSPCFG);
	mbcmd_set(mb, MBCMD(DSPCFG), OMAP_DSP_MBCMD_DSPCFG_REQ, 0);
	dsp_mbsend_and_wait(&mb, &ioctl_wait_q);

	if (ioctl_wait_cmd != 0) {
		printk(KERN_ERR "omapdsp: configuration error!\n");
		ret = -EINVAL;
		cfgstat = CFG_ERR;
		goto up_out;
	}

	if ((ret = dsp_task_config_all(n_stask)) < 0) {
		up(&ioctl_sem);
		dspuncfg();
		return -EINVAL;
	}

	cfgstat = CFG_READY;

	/* send parameter */
	if ((ret = dsp_setvar(OMAP_DSP_MBCMD_VARID_ICRMASK, dsp_icrmask)) < 0)
		goto up_out;
#ifdef CONFIG_PROC_FS
	dsp_create_runtime_procs();
#endif

up_out:
	up(&ioctl_sem);
	return ret;
}

int dspuncfg(void)
{
	if (dsp_taskmod_busy()) {
		printk(KERN_WARNING "omapdsp: tasks are busy.\n");
		return -EBUSY;
	}

	if (down_interruptible(&ioctl_sem))
		return -ERESTARTSYS;
	
	/* FIXME: lock task module */

#ifdef CONFIG_PROC_FS
	dsp_remove_runtime_procs();
#endif

	dsp_mb_stop();
	dsp_twch_stop();
	dsp_err_stop();
	dsp_task_unconfig_all();
	ipbuf_stop();
	cfgstat = CFG_ERR;

	up(&ioctl_sem);
	return 0;
}

int dsp_is_ready(void)
{
	return (cfgstat == CFG_READY) ? 1 : 0;
}

void dsp_runlevel(unsigned char level)
{
	struct mbcmd mb;

	mbcmd_set(mb, MBCMD(RUNLEVEL), level, 0);
	if (level == OMAP_DSP_MBCMD_RUNLEVEL_RECOVERY)
		dsp_mbsend_recovery(&mb);
	else
		dsp_mbsend(&mb);
}

int dsp_suspend(void)
{
	struct mbcmd mb;
	int ret = 0;

	if (down_interruptible(&ioctl_sem))
		return -ERESTARTSYS;

	if (!dsp_is_ready()) {
		printk(KERN_WARNING
		       "omapdsp: DSP is not ready. suspend failed.\n");
		ret = -EINVAL;
		goto up_out;
	}

	ioctl_wait_cmd = MBCMD(SUSPEND);
	mbcmd_set(mb, MBCMD(SUSPEND), 0, 0);
	dsp_mbsend_and_wait(&mb, &ioctl_wait_q);

	if (ioctl_wait_cmd != 0) {
		printk(KERN_ERR "omapdsp: DSP suspend error!\n");
		ret = -EINVAL;
		goto up_out;
	}

	udelay(100);
	dsp_reset();
	cfgstat = CFG_SUSPEND;
up_out:
	up(&ioctl_sem);
	return ret;
}

int dsp_resume(void)
{
	if (cfgstat != CFG_SUSPEND)
		return 0;

	cfgstat = CFG_READY;
	dsp_run();
	return 0;
}

/*
 * DSP control device file operations
 */
static int dsp_ctl_ioctl(struct inode *inode, struct file *file,
			 unsigned int cmd, unsigned long arg)
{
	int ret = 0;

	switch (cmd) {
	/*
	 * command level 1: commands which don't need lock
	 */
	case OMAP_DSP_IOCTL_RUN:
		dsp_run();
		break;

	case OMAP_DSP_IOCTL_RESET:
		dsp_reset();
		break;

	case OMAP_DSP_IOCTL_SETRSTVECT:
		ret = dsp_set_rstvect((unsigned long)arg);
		break;

	case OMAP_DSP_IOCTL_IDLE:
		dsp_idle();
		break;

	case OMAP_DSP_IOCTL_MPUI_WORDSWAP_ON:
		mpui_wordswap_on();
		break;

	case OMAP_DSP_IOCTL_MPUI_WORDSWAP_OFF:
		mpui_wordswap_off();
		break;

	case OMAP_DSP_IOCTL_MPUI_BYTESWAP_ON:
		mpui_byteswap_on();
		break;

	case OMAP_DSP_IOCTL_MPUI_BYTESWAP_OFF:
		mpui_byteswap_off();
		break;

	case OMAP_DSP_IOCTL_MBSEND:
		{
			struct omap_dsp_mailbox_cmd u_cmd;
			struct mbcmd_hw mb;
			if (copy_from_user(&u_cmd, (void *)arg, sizeof(u_cmd)))
				return -EFAULT;
			mb.cmd  = u_cmd.cmd;
			mb.data = u_cmd.data;
			ret = dsp_mbsend((struct mbcmd *)&mb);
			break;
		}

	case OMAP_DSP_IOCTL_SETVAR:
		{
			struct omap_dsp_varinfo var;
			if (copy_from_user(&var, (void *)arg, sizeof(var)))
				return -EFAULT;
			ret = dsp_setvar(var.varid, var.val[0]);
			break;
		}

	case OMAP_DSP_IOCTL_RUNLEVEL:
		dsp_runlevel(arg);
		break;

	/*
	 * command level 2: commands which need lock
	 */
	case OMAP_DSP_IOCTL_DSPCFG:
		ret = dspcfg();
		break;

	case OMAP_DSP_IOCTL_DSPUNCFG:
		ret = dspuncfg();
		break;

	case OMAP_DSP_IOCTL_TASKCNT:
		ret = dsp_task_count();
		break;

	case OMAP_DSP_IOCTL_SUSPEND:
		ret = dsp_suspend();
		break;

	case OMAP_DSP_IOCTL_RESUME:
		ret = dsp_resume();
		break;

	case OMAP_DSP_IOCTL_REGMEMR:
		{
			struct omap_dsp_reginfo *u_reg = (void *)arg;
			unsigned short adr, val;

			if (copy_from_user(&adr, &u_reg->adr, sizeof(short)))
				return -EFAULT;
			if ((ret = dsp_regread(OMAP_DSP_MBCMD_REGRW_MEMR,
					       adr, &val)) < 0)
				return ret;
			if (copy_to_user(&u_reg->val, &val, sizeof(short)))
				return -EFAULT;
			break;
		}

	case OMAP_DSP_IOCTL_REGMEMW:
		{
			struct omap_dsp_reginfo reg;

			if (copy_from_user(&reg, (void *)arg, sizeof(reg)))
				return -EFAULT;
			ret = dsp_regwrite(OMAP_DSP_MBCMD_REGRW_MEMW,
					   reg.adr, reg.val);
			break;
		}

	case OMAP_DSP_IOCTL_REGIOR:
		{
			struct omap_dsp_reginfo *u_reg = (void *)arg;
			unsigned short adr, val;

			if (copy_from_user(&adr, &u_reg->adr, sizeof(short)))
				return -EFAULT;
			if ((ret = dsp_regread(OMAP_DSP_MBCMD_REGRW_IOR,
					       adr, &val)) < 0)
				return ret;
			if (copy_to_user(&u_reg->val, &val, sizeof(short)))
				return -EFAULT;
			break;
		}

	case OMAP_DSP_IOCTL_REGIOW:
		{
			struct omap_dsp_reginfo reg;

			if (copy_from_user(&reg, (void *)arg, sizeof(reg)))
				return -EFAULT;
			ret = dsp_regwrite(OMAP_DSP_MBCMD_REGRW_IOW,
					   reg.adr, reg.val);
			break;
		}

	case OMAP_DSP_IOCTL_GETVAR:
		{
			struct omap_dsp_varinfo *u_var = (void *)arg;
			unsigned char varid;
			unsigned short val[5]; /* maximum */
			int argc;

			if (copy_from_user(&varid, &u_var->varid, sizeof(char)))
				return -EFAULT;
			switch (varid) {
			case OMAP_DSP_MBCMD_VARID_ICRMASK:
				argc = 1;
				break;
			case OMAP_DSP_MBCMD_VARID_LOADINFO:
				argc = 5;
				break;
			default:
				return -EINVAL;
			}
			if ((ret = dsp_getvar(varid, val, argc)) < 0)
				return ret;
			if (copy_to_user(&u_var->val, val, sizeof(short) * argc))
				return -EFAULT;
			break;
		}

	default:
		return -ENOIOCTLCMD;
	}

	return ret;
}
예제 #13
0
static int dsp_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
{
	AcquireSRWLockExclusive(&f->rw_lock);
	int r = 0;
	struct dsp_file *dsp = (struct dsp_file *)f;
	switch (cmd)
	{
	case SNDCTL_DSP_RESET:
	{
		log_info("SNDCTL_DSP_RESET.");
		dsp_reset(dsp);
		break;
	}
	case SNDCTL_DSP_SPEED:
	{
		if (!mm_check_read((int *)arg, sizeof(int)))
		{
			r = -L_EFAULT;
			break;
		}
		int speed = *(int *)arg;
		log_info("SNDCTL_DSP_SPEED: %d", speed);
		DWORD old_speed = dsp->format.nSamplesPerSec;
		dsp->format.nSamplesPerSec = speed;
		if (!dsp_test_format(&dsp->format))
		{
			log_warning("Speed not supported.");
			dsp->format.nSamplesPerSec = old_speed;
			r = -L_EINVAL;
		}
		break;
	}
	case SNDCTL_DSP_STEREO:
	{
		if (!mm_check_read((int *)arg, sizeof(int)))
		{
			r = -L_EFAULT;
			break;
		}
		int c = *(int *)arg;
		log_info("SNDCTL_DSP_STEREO: %d", c);
		if (c == 0)
			dsp->format.nChannels = 1;
		else if (c == 1)
			dsp->format.nChannels = 2;
		else
		{
			log_warning("Invalid argument (can only be 0 or 1).");
			r = -L_EINVAL;
		}
		break;
	}
	case SNDCTL_DSP_SETFMT:
	{
		if (!mm_check_read((int *)arg, sizeof(int)))
		{
			r = -L_EFAULT;
			break;
		}
		int fmt = *(int *)arg;
		log_info("SNDCTL_DSP_SETFMT: 0x%x", fmt);
		if (fmt == AFMT_S16_LE)
			dsp->format.wBitsPerSample = 16;
		else if (fmt == AFMT_U8)
			dsp->format.wBitsPerSample = 8;
		else
		{
			log_warning("Invalid argument (can only be AFMT_S16_LE or AFMT_U8).");
			r = -L_EINVAL;
		}
		break;
	}
	case SNDCTL_DSP_GETFMTS:
	{
		if (!mm_check_write((int *)arg, sizeof(int)))
		{
			r = -L_EFAULT;
			break;
		}
		log_info("SNDCTL_DSP_GETFMTS");
		*(int *)arg = AFMT_U8 | AFMT_S16_LE;
		break;
	}
	}
	ReleaseSRWLockExclusive(&f->rw_lock);
	return r;
}