- 论坛徽章:
- 0
|
今天一天,主要熟悉了9200在linux中的一些配置,以及9200的Debug串口的驱动编程。在参考kgdb补丁在pxa的板子上对于kgdb_serial.c文件(了解其函数意图,在9200上实现其同等功能)。代码是写出来了,但是还没有编译,这边先贴出来给大家,哪位大侠了解的也帮忙找找bug。明天开始编译实验。大家祝我好运啊!!
/*
* linux/arch/arm/mach-at91rm9200/kgdb-serial.c
*
* Provides low level kgdb serial support hooks for PXA2xx boards
*
* Author: dengdalong
* Copyright: (C) 2002-2005 MontaVista Software Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/config.h>
#include <linux/serial_reg.h>
#include <linux/kgdb.h>
#include <asm/processor.h>
#include <asm/hardware.h>
#include <asm/arch/AT91RM9200_USART.h>
#include <asm/mach/serial_at91rm9200.h>
#include <asm/arch/board.h>
#include <asm/arch/pio.h>
/*
*********************************************************
* virtual to Physical Address mapping for IO devices.
*********************************************************
*/
#define AT91C_VA_BASE_DBGU ((unsigned long) &(AT91_SYS->DBGU_CR))
AT91PS_USART pUSART = (AT91PS_USART)AT91C_VA_BASE_DBGU;
/*
*********************************************************
* Standard Asynchronous Mode : 8 bits , 1 stop , no parity
*********************************************************
*/
#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \
AT91C_US_NBSTOP_1_BIT + \
AT91C_US_PAR_NONE + \
AT91C_US_CHRL_8_BITS + \
AT91C_US_CLKS_CLOCK )
/*
*********************************************************
* KGDB Serial Baudrate
*********************************************************
*/
#define UART_BAUDRATE (CONFIG_KGDB_BAUDRATE)
/*
*********************************************************
* fn AT91F_DBGU_CfgPIO
* brief Configure PIO controllers to drive DBGU signals
*********************************************************
*/
void AT91_DBGU_CfgPIO(void)
{
AT91_SYS-> IOA_ASR = (AT91C_PA31_DTXD | AT91C_PA30_DRXD);
AT91_SYS-> IOA_BSR = 0;
AT91_CfgPIO_DBUG();
return;
}
/*
*********************************************************
* fn AT91F_US_Baudrate
* brief Caluculate baud_value according to the main clock and the baud rate
*********************************************************
*/
__inline unsigned int AT91F_US_Baudrate (
const unsigned int main_clock, // \arg peripheral clock
const unsigned int baud_rate) // \arg UART baudrate
{
unsigned int baud_value = ((main_clock*10)/(baud_rate * 16));
if ((baud_value % 10) >= 5)
baud_value = (baud_value / 10) + 1;
else
baud_value /= 10;
return baud_value;
}
/*
*********************************************************
* fn AT91F_US_SetBaudrate
* brief Set the baudrate according to the CPU clock
*********************************************************
*/
__inline void AT91F_US_SetBaudrate (
AT91PS_USART pUSART, // \arg pointer to a USART controller
unsigned int mainClock, // \arg peripheral clock
unsigned int speed) // \arg UART baudrate
{
//* Define the baud rate divisor register
pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed);
}
/*
*********************************************************
* fn AT91F_US_Configure
* brief Configure USART
*********************************************************
*/
void AT91F_US_Configure (
AT91PS_USART pUSART, // \arg pointer to a USART controller
unsigned int mainClock, // \arg peripheral clock
unsigned int mode , // \arg mode Register to be programmed
unsigned int baudRate , // \arg baudrate to be programmed
unsigned int timeguard ) // \arg timeguard to be programmed
{
//* Disable interrupts
pUSART->US_IDR = (unsigned int) -1;
//* Reset receiver and transmitter
pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ;
//* Define the baud rate divisor register
AT91F_US_SetBaudrate(pUSART, mainClock, baudRate);
//* Write the Timeguard Register
pUSART->US_TTGR = timeguard;
//* Define the USART mode
pUSART->US_MR = mode ;
}
static int kgdb_serial_init(void)
{
// Open PIO for DBGU
AT91_DBGU_CfgPIO();
// Configure DBGU
AT91F_US_Configure (
pUSART, // DBGU base address
at91_master_clock, // 60 MHz
AT91C_US_ASYNC_MODE , // mode Register to be programmed
UART_BAUDRATE , // baudrate to be programmed
0); // timeguard to be programmed
// Enable Transmitter and Receiver
pUSART->US_CR = (AT91C_US_RXEN | AT91C_US_TXEN);
return 0;
}
static void kgdb_serial_putchar(int c)
{
if (!(pUSART->US_CR | AT91C_US_RXEN | AT91C_US_TXEN))
kgdb_serial_init();
while (!(pUSART->US_CSR & AT91C_US_TXRDY)) //wait tx
cpu_relax();
pUSART->US_THR = (c & 0x1FF);
}
static void kgdb_serial_flush(void)
{
if ( (pUSART->US_CR | AT91C_US_RXEN) && (pUSART->US_CR | AT91C_US_TXEN) )
while (!(pUSART->US_CSR & AT91C_US_TXRDY))
cpu_relax();
}
static int kgdb_serial_getchar(void)
{
unsigned char c;
if (!(pUSART->US_CR | AT91C_US_RXEN | AT91C_US_TXEN))
kgdb_serial_init();
while (!(pUSART->US_CSR & AT91C_US_RXRDY))
cpu_relax();
c = (pUSART->US_RHR) & 0x1FF;
return c;
}
struct kgdb_io kgdb_io_ops = {
.init = kgdb_serial_init,
.write_char = kgdb_serial_putchar,
.flush = kgdb_serial_flush,
.read_char = kgdb_serial_getchar,
}; |
|