Hello,

As I wrote before, I'm trying to use the DMA API to copy audio data to the PSC1 
which has a digital - analog - converter attached to it.
I read the explanation that Sylvain wrote at: 
http://ozlabs.org/pipermail/linuxppc-dev/2007-May/036229.html and programmed 
the following code:


static void SPI_setup(void)
{

        int psc_num = 1;
        phys_addr_t rx_fifo;
        phys_addr_t tx_fifo;
        struct bcom_bd *bd;

        uint32 SICR;

        psc = ioremap(MPC52xx_PA(MPC52xx_PSCx_OFFSET(1)), MPC52xx_PSC_SIZE);
        
        gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE);
        
        cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE);

        switch(psc_num) {
                case 1:
                        initiator_tx = BCOM_INITIATOR_PSC1_TX;
                        initiator_rx = BCOM_INITIATOR_PSC1_RX;
                        break;
                case 2:
                        initiator_tx = BCOM_INITIATOR_PSC2_TX;
                        initiator_rx = BCOM_INITIATOR_PSC2_RX;
                        break;
                default:
                        panic("snd-SPImgt.o: invalid value for psc_num 
(%i)\n",psc_num);
                        break;
        };
        
        printk("Before gpio->port_config\n");

        gpio->port_config               |= PORT_CONFIG_PSC1;
        printk("Before cdm->clk_enables\n");
        cdm->clk_enables                |= PSC1_CLK_EN;
        printk("Before cdm->mclken_div_psc1\n");
        cdm->mclken_div_psc1    = MCLKEN_DIV;
        
        SICR = 0x02000000;
        SICR |= 0x00002000;
        SICR |= 0x0090C000;
        
        psc->command    = 0x0A;
        psc->sicr       = SICR;
        psc->ctur       = 0x00;
        psc->ctlr       = 0x84;
        psc->ccr        &= 0xFF0000FF;
        psc->rfalarm    = 0x000C;               /* alarm occurs if 12 bytes 
space in the RxFIFO */
        psc->tfalarm    = 0x0010;               /* alarm occurs if 16 bytes are 
in the TxFIFO */
        psc->rfcntl     &= 0xF8;                /* set granularity to 0 */
        psc->tfcntl     &= 0xF8;                /* set granularity to 0 */
        psc->isr_imr.isr        = 0x01;
        psc->isr_imr.imr        = 0x00;         /* enable TxRDY interrupt */ 
        psc->mode       = 0x00;                 /* set RX interrupt to RxRDY */
        psc->command    = 0x05;                 /* enable Tx and Rx */

        psc->tfdata = 0xF001;
        wait(1000);
        psc->tfdata = 0xF000;

        printk("Before bcom_gen_bd_rx_init\n");
        rx_bcom = bcom_gen_bd_rx_init(64, (phys_addr_t)&(psc->rfdata), 
initiator_rx, 6, 1024);
        printk("Before bcom_gen_bd_tx_init\n");
        tx_bcom = bcom_gen_bd_tx_init(64, (phys_addr_t)&(psc->tfdata), 
initiator_tx, 6);

        printk("txtask is %d rxtask is %d\n", tx_bcom->tasknum, 
rx_bcom->tasknum);

        r_irq = bcom_get_task_irq(rx_bcom);
        t_irq = bcom_get_task_irq(tx_bcom);
        
        printk("t_irq is %d r_irq is %d\n", t_irq, r_irq);

        if (request_irq(r_irq, &SPI_rx_irq, IRQF_DISABLED, "SPI rx dma", NULL)) 
{
                printk(KERN_ERR "SPI: SDMA rx irq allocation failed\n");
                return;
        } else printk("SPI: SDA rx irq allocation succeded\n");
        if (request_irq(t_irq, &SPI_tx_irq, IRQF_DISABLED, "SPI tx dma", NULL)) 
{
                printk(KERN_ERR "SPI: SDMA tx irq allocation failed\n");
                return;
        } else printk("SPI: SDA tx irq allocation succeded\n");

        bcom_gen_bd_tx_reset(tx_bcom);
        bcom_gen_bd_rx_reset(rx_bcom);

        bcom_retrieve_buffer(tx_bcom, NULL, NULL);
        bd = bcom_prepare_next_buffer(tx_bcom);
        bd->status = 1024;
        bd->data[0] = (void *)SPI_tx_silence.pa;
        bcom_submit_next_buffer(tx_bcom, (void *)SPI_tx_silence.pa);

        bcom_dump_bdring(tx_bcom);
        bcom_dump_bdring(rx_bcom);

        printk("Tasks enabled\n");

        psc->command = MPC52xx_PSC_TX_ENABLE | MPC52xx_PSC_RX_ENABLE;
        
}


Although everything seems to be executed without problems, the interrupt 
routines are never called, and no data seems to be copied to the PSC.
Could it be that  I don“t understand the purpose of bd->data and bd->status 
correctly? Is there any other Documentation or example code I can take a look 
and learn how to use the API?

Thanks,

Pedro L. Dominguez
[EMAIL PROTECTED]
_________________________________________________________________
Consigue el nuevo Windows Live Messenger
http://get.live.com/messenger/overview
_______________________________________________
Linuxppc-embedded mailing list
Linuxppc-embedded@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-embedded

Reply via email to