Base Baud Calculation

Eugene Surovegin ebs at innocent.com
Mon Nov 4 06:29:41 EST 2002


Aman,

At 03:57 AM 11/3/2002, you wrote:
>  How is the base_baud in linux for PPC 440GP calculated?.

Here is the piece of code I use on our custom 440GP board (works also on
Ebony):

static void __init XXXXXXX_serial_init(void){

     struct serial_struct serial_req;
     int baud_base;

     /* Determine baud base */
     unsigned long cpc0_cr0 = mfdcr(DCRN_CPC0_CR0);

     if (cpc0_cr0 & 0x00400000){
         /* External UART0 clock (eval board uses 6*1.8432 MHz clock) */
         baud_base = (6 * 1843200) / 16;
     }
     else {
         /* Internal UART0 clock */
        int uart_div = ((cpc0_cr0 & 0x001f0000) >> 16) + 1;
         baud_base = (XXXXXX_clocks.plb * 1000000) / uart_div / 16;
     }

     /* Setup ioremapped serial port access */
     memset(&serial_req, 0, sizeof(serial_req));
     serial_req.line = 0;
     serial_req.baud_base = baud_base;
     serial_req.port = 0;
     serial_req.irq = UART0_INT;
     serial_req.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST;
     serial_req.io_type = SERIAL_IO_MEM;
     serial_req.iomem_base = ioremap64(PPC440GP_UART0_ADDR, 8);
     serial_req.iomem_reg_shift = 0;

     if (early_serial_setup(&serial_req) != 0) {
         printk(KERN_ALERT"Early serial init of port 0 failed\n");
     }
}

One comment, XXXXXX_clocks - structure that holds different clocks in MHz.
For example, XXXXXX_clocks.plb is equal to 133.

Usually, this value can be hardcoded, but I find this way more convenient,
especially when running the same image on different boards with different
clock setup.

Regards,

  Eugene Surovegin <mailto:ebs at innocent.com>


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-embedded mailing list