免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6291 | 回复: 5
打印 上一主题 下一主题

arm平台的kgdb调试实验 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-10 17:49 |只看该作者 |倒序浏览
本人手上有一块at9200的arm板,现在想在这块板子上面建立kgdb的调试。在做这个实验之前,本人参考了bob_zhang2004的贴子,实现了在vmware下的x86平台linux的kgdb调试。现在准备建立arm平台,在这边先说说我的意图,希望大家指导,

    在bob_zhang2004的帖子中,也说明了arm平台建立kgdb调试的思路,就是在打了core-lite.patch  和 arm-lite.patch的补丁后,我们需要在arch/arm/mach-XXX/目录下实现适合我们自己板子的kgdb-serial.c文件。

    在kgdb-serial.c文件中,主要是实现下面的几个函数:kgdb_serial_init() , kgdb_serial_putchar() , kgdb_serial_getchar() 。这在http://www.arm.linux.org.uk/deve ... tch.php?id=1335%2F1上有说明。

    不知道谁用这种方法实现了arm平台的kgdb调试。还请各位指导指导。本人正在实验中!!!

论坛徽章:
0
2 [报告]
发表于 2007-09-11 18:28 |只看该作者
今天一天,主要熟悉了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,
};

论坛徽章:
0
3 [报告]
发表于 2007-09-11 18:49 |只看该作者
编译很快的,怎么要等到明天哦

祝你好运!

论坛徽章:
0
4 [报告]
发表于 2007-09-12 18:33 |只看该作者
今天在把2.6.13版本下编写的kgdb_serial.c文件修改成适合2.6.15.5版本。2.6.15.5版本主要是9200的补丁在头文件上作了很大的修改。对于很多结构体以及物理地址与虚拟地址之间的转换的方式都做了修改。这些修改有下面几个头文件中就可以体现出来:include\asm-arm\arch-at91rm9200目录下的
AT91RM9200_USART.h  hardware.h  board.h  AT91RM9200_SYS.h  pio.h  AT91RM9200.h。
    所以这边修改了kgdb_serial.c文件。如下(源码可以到我的blog上下载:ddlav478.cublog.cn  《基于at91rm9200的arm平台kgdb+linux内核调试》)
    我们把kgdb_serial.c文件放置在目录arch/arm/mach-at91rm9200/目录下,并且修改该目录下的Makefile。在Makefile的最后加上:
    obj-$(CONFIG_KGDB) += kgdb_serial.o   /* 在kgdb调试功能打开的时候,编译kgdb_serial.cw文件 */

    配置完后,我们就按照正常的配置方式配置内核,对于kgdb选项我们要选上:
kernel hacking ---> KGDB: kernel debugging with remote gdb
                    --->KGDB: Console messages through gdb
                        --->Method for KGDB communication(KGDB: Use only kernel modules for I/O)
    内核配置完毕之后,我们就可以make zImage来生成zImage。然后通过uboot的mkimage来生成uImage. 这边还需要注意的是,在uboot传递给kernel的启动参数必须加上kgdbwait参数。在kgdb的官方文档中介绍的kgdbwait 8250kgdb=0,115200。因为我们不是用8250的串口控制器,所以我们只要传递kgdbwait的这个参数。(本人暂时是这样做的)。我的启动参数如下:
    bootargs=root=/dev/ram rw kgdbwait initrd=0x20a00000,4M init=/linux
rc console=ttyS0,115200,mem=16m ip=192.168.2.10
   
    下载内核后,启动内核:
## Booting image at 20007fc0 ...
   Image Name:   Linux 2.6.15.5
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    928060 Bytes = 906.3 kB
   Load Address: 20007fc0
   Entry Point:  20008000
   Verifying Checksum ... OK
   XIP Kernel Image ... OK

Starting kernel ...

Uncompressing Linux.............................................................
..... done, booting the kernel.

这个时候我在host端上开启我的gdb:
[root@dengdalong linux-2.6.15.5]# ./gdbmod-2.4 vmlinux
GNU gdb 6.4
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/tls/i686/libthread_db.so.1".

(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
do_early_param (param=0xc001e195 "kgdbwait", val=0x0) at init/main.c:412
412     {
(gdb) break console_init
Breakpoint 1 at 0xc0016d0c: file drivers/char/tty_io.c, line 2928.
(gdb) c
Continuing.
[New thread 32768]

Program received signal SIGTRAP, Trace/breakpoint trap.
0x2001dc08 in ?? () at proc_fs.h:194
194             remove_proc_entry(name,proc_net);
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x2001dc08 in ?? () at proc_fs.h:194
194             remove_proc_entry(name,proc_net);
(gdb) list
189             return res;
190     }
191
192     static inline void proc_net_remove(const char *name)
193     {
194             remove_proc_entry(name,proc_net);
195     }
196
197     #else
    这边我们可以判断host端的gdb已经和target上的kgdb连接上了。但是我发现内核根本无法启动,一直在0x2001dc08 in ?? () at proc_fs.h:194
194             remove_proc_entry(name,proc_net) 停下来。这边还是个问题。不知道哪位大侠能够帮忙解决一下。我也将继续努力,希望能给大家送上好消息

论坛徽章:
0
5 [报告]
发表于 2007-09-13 13:54 |只看该作者

194             remove_proc_entry(name,proc_net) 停下来。
你怎么也是在这里停下来
我们公司前段时间移植操作系统,port上去后,启动一半就停下来
gdb的时候也是在这里停下来,现在也在找原因

论坛徽章:
0
6 [报告]
发表于 2007-09-13 15:25 |只看该作者
augustusqing网友提醒了我一下,我在host端上用的gdb是kgdb生成好的gdbmod2.4,这个是针对i386平台的。所以我们应该去下载gdb6.4的版本来编译出arm-linux-gdb来连接target上的kgdb。

现在有事,没有办法实验,明天实验!!希望给大家带来好消息!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP