主题 : 调试Tiny6410的Uart1出现发送卡死现象? 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 3629
精华: 0
发帖: 71
金钱: 365 两
威望: 73 点
综合积分: 142 分
注册时间: 2009-01-27
最后登录: 2020-04-08
楼主  发表于: 2011-07-08 18:08

 调试Tiny6410的Uart1出现发送卡死现象?

调试Tiny6410的Uart1出现发送卡死现象?
发送缓冲器总是发送不出去,然后就卡死了...找了下时钟的原因但是都很正常...郁闷中!
我用printk进行调试的,测试应用程序还没写...程序也不完整望大虾见谅!
QQ:252501870
附上代码:
Tiny6410_Uart1.rar (3 K) 下载次数:4

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/poll.h>
#include <linux/wait.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <linux/sched.h>

#include <asm/irq.h>
#include <asm/uaccess.h>
#include <linux/irq.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include <mach/hardware.h>
#include <linux/errno.h>
#include <mach/regs-gpio.h>
#include <linux/delay.h>

MODULE_LICENSE("GPL");

#define ULCON0        (0x7F005000)
#define    ULCON1        (0x7F005400)
#define ULCON2        (0x7F005800)
#define ULCON3        (0x7F005C00)

#define    UCON0        (0x7F005004)
#define    UCON1        (0x7F005404)
#define UCON2        (0x7F005804)
#define    UCON3        (0x7F005C04)

#define UFCON0        (0x7F005008)
#define    UFCON1        (0x7F005408)
#define UFCON2        (0x7F005808)
#define    UFCON3        (0x7F005C08)

#define    UMCON0        (0x7F00500C)
#define    UMCON1        (0x7F00540C)

#define    UTRSTAT0    (0x7F005010)
#define UTRSTAT1    (0x7F005410)
#define    UTRSTAT2    (0x7F005810)
#define    UTRSTAT3    (0x7F005C10)

#define    UERSTAT0    (0x7F005014)
#define UERSTAT1    (0x7F005414)
#define    UERSTAT2    (0x7F005814)
#define    UERSTAT3    (0x7F005C14)

#define    UFSTAT0        (0x7F005018)
#define UFSTAT1        (0x7F005418)
#define    UFSTAT2        (0x7F005818)
#define    UFSTAT3        (0x7F005C18)

#define UMSTAT0        (0x7F00501C)
#define    UMSTAT1        (0x7F00541C)

#define UTXH0        (0x7F005020)
#define UTXH1        (0x7F005420)
#define    UTXH2        (0x7F005820)
#define    UTXH3        (0x7F005C20)

#define URXH0        (0x7F005024)
#define    URXH1        (0x7F005424)
#define    URXH2        (0x7F005824)
#define URXH3        (0x7F005C24)

#define UBRDIV0        (0x7F005028)
#define UBRDIV1        (0x7F005428)
#define    UBRDIV2        (0x7F005828)
#define UBRDIV3        (0x7F005C28)

#define    UDIVSLOT0    (0x7F00502C)
#define UDIVSLOT1    (0x7F00542C)
#define UDIVSLOT2    (0x7F00582C)
#define UDIVSLOT3    (0x7F005C2C)

#define UINTP0        (0x7F005030)
#define    UINTP1        (0x7F005430)
#define UINTP2        (0x7F005830)
#define    UINTP3        (0x7F005C30)

#define UINTSP0        (0x7F005034)
#define    UINTSP1        (0x7F005434)
#define    UINTSP2        (0x7F005834)
#define    UINTSP3        (0x7F005C34)

#define UINTM0        (0x7F005038)
#define    UINTM1        (0x7F005438)
#define    UINTM2        (0x7F005838)
#define    UINTM3        (0x7F005C38)

#define    GPACON        (0x7F008000)
#define GPADAT        (0x7F008004)
#define    GPAPUD        (0x7F008008)
#define    GPACONSLP    (0x7F00800C)
#define    GPAPUDSLP    (0x7F008010)

#define CLK_SRC        (0x7E00F01C)
#define    CLK_DIV1    (0x7E00F024)
#define PCLK_GATE    (0x7E00F034)
#define    SCLK_GATE    (0x7E00F038)

void *R_GPACON,*R_GPADAT,*R_GPAPUD,*R_GPACONSLP,*R_GPAPUDSLP;
void *R_ULCON1,*R_UCON1,*R_UFCON1,*R_UMCON1,*R_UTRSTAT1,*R_UERSTAT1,*R_UFSTAT1,*R_UMSTAT1;
void *R_UTXH1,*R_URXH1,*R_UBRDIV1,*R_UDIVSLOT1,*R_UINTP1,*R_UINTSP1,*R_UINTM1;
void *R_CLK_SRC,*R_CLK_DIV1,*R_PCLK_GATE,*R_SCLK_GATE;

static irqreturn_t  Uart1_ReceiveByte(int irq,void *dev_id);
static void Uart1_Unmap(void);
static void Uart1_Remap(void);
static void Uart1_SendByte(unsigned char dat);
static void Uart1_ReceiveBytePoll();
static int err=0;

static void Uart1_Remap(void)
{
    if(!request_mem_region(0x7f005400,0x100,"Yaoxing_Uart1"))
    {
        printk("Yaoxing_Uart1 request_mem_region -EBUSY\n");
    }
    else
    {
        printk("Yaoxing_Uart1 request_mem_region PASS\n");
    }

    R_SCLK_GATE=ioremap(SCLK_GATE,4);
    R_CLK_SRC=ioremap(CLK_SRC,4);
    R_CLK_DIV1=ioremap(CLK_DIV1,4);
    R_PCLK_GATE=ioremap(PCLK_GATE,4);
    

    R_GPACON=ioremap(GPACON,4);
    R_GPADAT=ioremap(GPADAT,4);
    R_GPAPUD=ioremap(GPAPUD,4);
    R_GPACONSLP=ioremap(GPACONSLP,4);
    R_GPAPUDSLP=ioremap(GPAPUDSLP,4);

    R_ULCON1=ioremap(ULCON1,4);
    R_UCON1=ioremap(UCON1,4);
    R_UFCON1=ioremap(UFCON1,4);
    R_UMCON1=ioremap(UMCON1,4);
    R_UTRSTAT1=ioremap(UTRSTAT1,4);
    
    R_UERSTAT1=ioremap(UERSTAT1,4);
    R_UFSTAT1=ioremap(UFSTAT1,4);
    R_UMSTAT1=ioremap(UMSTAT1,4);
    R_UTXH1=ioremap(UTXH1,4);
    R_URXH1=ioremap(URXH1,4);
    
    R_UBRDIV1=ioremap(UBRDIV1,4);
    R_UDIVSLOT1=ioremap(UDIVSLOT1,4);
    R_UINTP1=ioremap(UINTP1,4);
    R_UINTSP1=ioremap(UINTSP1,4);
    R_UINTM1=ioremap(UINTM1,4);
}

static void Uart1_Unmap(void)
{
    iounmap(R_SCLK_GATE);
    iounmap(R_CLK_SRC);
    iounmap(R_CLK_DIV1);
    iounmap(R_PCLK_GATE);
    
    iounmap(R_GPACON);
    iounmap(R_GPADAT);
    iounmap(R_GPAPUD);
    iounmap(R_GPACONSLP);
    iounmap(R_GPAPUDSLP);

    iounmap(R_ULCON1);
    iounmap(R_UCON1);
    iounmap(R_UFCON1);
    iounmap(R_UMCON1);
    iounmap(R_UTRSTAT1);
    
    iounmap(R_UERSTAT1);
    iounmap(R_UFSTAT1);
    iounmap(R_UMSTAT1);
    iounmap(R_UTXH1);
    iounmap(R_URXH1);
    
    iounmap(R_UBRDIV1);
    iounmap(R_UDIVSLOT1);
    iounmap(R_UINTP1);
    iounmap(R_UINTSP1);
    iounmap(R_UINTM1);
    
    release_mem_region(0x7f005400,0x100);
}

static irqreturn_t  Uart1_ReceiveByte(int irq,void *dev_id)
{
    unsigned char tmp8;
    unsigned int tmp16;
    unsigned long tmp32;

    printk("Uart1 is asserted!\n");
    tmp32=ioread32(R_UTRSTAT1);
    tmp16=0xf;
    while(tmp16--)
    {
        if((tmp32&0x1)==0x1)
        {
            tmp8=ioread8(R_URXH1);
            printk("Uart1_ReceiveByte R_URXH1 data is received!\n");
            break;
        }
        else
        {
            tmp32=ioread32(R_UTRSTAT1);
            printk("Uart1_ReceiveByte R_URXH1 wait for data!\n");    
            msleep(1);
        }    
    }    
    
    printk("Uart1 = %d OK\n",tmp8);
    return IRQ_RETVAL(IRQ_HANDLED);    
}

static void Uart1_ReceiveBytePoll()
{
    unsigned char tmp8;
    unsigned int tmp16;
    unsigned long tmp32;

    printk("Uart1_ReceiveBytePoll is asserted!\n");
    tmp32=ioread32(R_UTRSTAT1);
    tmp16=0xf;
    while(tmp16--)
    {
        if((tmp32&0x1)==0x1)
        {
            tmp8=ioread8(R_URXH1);
            printk("Uart1_ReceiveByte R_URXH1 data is received!\n");
            break;
        }
        else
        {
            tmp32=ioread32(R_UTRSTAT1);
            printk("Uart1_ReceiveByte R_URXH1 wait for data!\n");    
            msleep(1);
        }    
    }    
    
    printk("Uart1 = %d OK\n",tmp8);
    
}

static int __init Uart1_Init(void)
{
    unsigned char tmp8;
    unsigned int tmp16;
    unsigned long tmp32;

    printk("Uart1_Init Entred!\n");
    Uart1_Remap();
    printk("Uart1_Remap OK!\n");    

    printk("Uart1_Init Start Setup Registers!\n");
    
    /*R_CLK_SRC,R_CLK_DIV1,R_PCLK_GATE,R_SCLK_GATE*/
    tmp32=ioread32(R_SCLK_GATE);
    printk("R_SCLK_GATE=%d\n",R_SCLK_GATE);
    tmp32|=(1<<5);
    iowrite32(tmp32,R_SCLK_GATE);
    
    tmp32=ioread32(R_PCLK_GATE);
    printk("R_PCLK_GATE=%d\n",R_PCLK_GATE);
    tmp32|=(1<<2);
    iowrite32(tmp32,R_PCLK_GATE);
    
    tmp32=ioread32(R_CLK_DIV1);
    printk("R_CLK_DIV1=%d\n",R_CLK_DIV1);
    if(((tmp32>>16)&0xf))
    {
        printk("R_CLK_DIV1=%d\n");    
    }
    else
    {
        printk("Error:R_CLK_DIV1=0\n");        
    }
    
    tmp32=ioread32(R_CLK_SRC);
    printk("R_CLK_SRC=%d\n",R_CLK_SRC);
    if((tmp32>>13)&0x01)
    {
        printk("R_CLK_SRC=1\n");    
    }
    else
    {
        printk("Error:R_CLK_SRC=0\n");        
    }
    
    
    
    
    
    
    
    tmp32=ioread32(R_GPACON);
    tmp32&=~(0xff<<16);
    tmp32|=(0x22<<16);
    iowrite32(tmp32,R_GPACON);
    
    tmp32=ioread32(R_GPAPUD);
    tmp32=0x00;
    iowrite32(tmp32,R_GPAPUD);
    
    tmp32=ioread32(R_ULCON1);
//    printk("R_ULCON1=%d\n",tmp32);
    tmp32|=((0<<6)|(0<<3)|(0<<2)|(0x3<<0));
    iowrite32(tmp32,R_ULCON1);

    tmp32=ioread32(R_UCON1);
    tmp32|=((0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0));
    iowrite32(tmp32,R_UCON1);
    
    tmp32=ioread32(R_UFCON1);
    tmp32|=((0<<6)|(0<<4)|(0<<2)|(0<<1)|(0<<0));
    iowrite32(tmp32,R_UFCON1);
    
    tmp32=ioread32(R_UMCON1);
    tmp32|=((0<<5)|(0<<4)|(0<<0));
    iowrite32(tmp32,R_UMCON1);
    
    tmp32=34;
    iowrite32(tmp32,R_UBRDIV1);
    tmp32=ioread32(R_UBRDIV1);
    printk("R_UBRDIV1 35=%d\n",tmp32);

    tmp32=0xDDDD;
    iowrite32(tmp32,R_UDIVSLOT1);
    tmp32=ioread32(R_UDIVSLOT1);
    printk("R_UDIVSLOT1 128=%d\n",tmp32);

    printk("Uart1_Init Setup Registers OK!\n");
    printk("Uart1_Init Setup IRQ!\n");
    err=request_irq(IRQ_S3CUART_RX1,Uart1_ReceiveByte,0,"Yaoxing_Uart1",0);/*IRQ_S3CUART_RX1 IRQF_DISABLED   IRQ_TYPE_EDGE_FALLING*/
    printk("Uart1_Init Setup IRQ OK!\n");
    if(err==-EBUSY)
    {
        printk("Error=-EBUSY\n\n",err);    
        while(1);
    }
    else if(err==-EINVAL)
    {
        printk("Error=-INVAL\n\n",err);
        while(1);
    }

    printk("Uart1_Init OK!\n");
    Uart1_SendByte(0xaa);
    Uart1_ReceiveBytePoll();
    //Uart1_SendByte(0xaa);
    tmp32=ioread32(R_UERSTAT1);
    printk("UERSTAT1=%d\n",R_UERSTAT1);
    return 0;
}

static void Uart1_SendByte(unsigned char dat)
{
    unsigned char tmp8;
    unsigned int tmp16;
    unsigned long tmp32;

    printk("Uart1_SendByte entred!\n");
    while(!(tmp32&0x2))
    {
        tmp32=ioread32(R_UTRSTAT1);
        mdelay(1);            
    }
    iowrite8(dat,R_UTXH1);
    printk("Uart1_SendByte OK!\n");
}

static void __exit Uart1_Exit(void)
{
    //disable_irq(IRQ_S3CUART_RX1);
    free_irq(IRQ_S3CUART_RX1,NULL);
    Uart1_Unmap();
    printk("Uart1_Exit OK!\n");      
}

module_init(Uart1_Init);
module_exit(Uart1_Exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Yaoxing");
MODULE_DESCRIPTION("Yaoxing's E-mail:comet0202@163.com");
级别: 侠客
UID: 3629
精华: 0
发帖: 71
金钱: 365 两
威望: 73 点
综合积分: 142 分
注册时间: 2009-01-27
最后登录: 2020-04-08
1楼  发表于: 2011-07-08 18:14
代码直接插入linux内核编译后就能用,测试过了没有错误~就是驱动不起来也不知道什么原因!
由于在/proc/iomem里已经注册了,所以得先卸载uart1掉才能用...
不想卸载可以把这些代码屏蔽掉:
/*    if(!request_mem_region(0x7f005400,0x100,"Yaoxing_Uart1"))
    {
        printk("Yaoxing_Uart1 request_mem_region -EBUSY\n");
    }
    else
    {
        printk("Yaoxing_Uart1 request_mem_region PASS\n");
    }*/
/*
release_mem_region(0x7f005400,0x100);*/
级别: 侠客
UID: 3629
精华: 0
发帖: 71
金钱: 365 两
威望: 73 点
综合积分: 142 分
注册时间: 2009-01-27
最后登录: 2020-04-08
2楼  发表于: 2011-07-09 15:41
问题解决了,结贴!