打印

驱动问题

[复制链接]
1575|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hlnzxl|  楼主 | 2007-6-12 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
vi, ic, ST, ev, ce

LLeader(94125943) 20:48:49
我编写的LED驱动,其中寄存器的配置在ADS调试时没有问题。但是在linux操作系统里面,不能驱动,程序如下,请高手指教:
/*#define MODULE*/
#include <linux/kernel.h>
#include <linux/module.h>

#include <asm/uaccess.h>


#include <linux/mm.h>
#include <linux/ioport.h>

#include <asm/io.h>
#include <linux/ioport.h>


#include <linux/fs.h>
#include <linux/wrapper.h>


#define DRAM_MEM_MAJOR 231
#define DEVICE_NAME  "device_led"
#define SUCCESS   0




static int Device_Open = 0;

int dram_mem_init(void);
static int device_open(struct inode *,struct file *);
static int device_release(struct inode *,struct file *);
static ssize_t device_write(struct file *,const char *,size_t,loff_t *);
int init_module(void);
void cleanup_module(void);


struct file_operations  dram_mem_ops =
{
      read:      device_read,
      write:     device_write,
      open:      device_open,
      release:   device_release,
};

static int Major;

unsigned long virt_addr0; 
unsigned long virt_addr1;
unsigned long virt_addr2;
int dram_mem_init(void)
{

    
    virt_addr0 = (unsigned long)ioremap((unsigned long)0x56000050,0x4);
     *(unsigned long *)virt_addr0&= 0x00ff;//娓呴浂 
     *(unsigned long *)virt_addr0|= 0x5500;//杈撳嚭鏈夋晥
    virt_addr1 = (unsigned long)ioremap((unsigned long)0x56000054,0x4);
     *(unsigned long *)virt_addr1=0x0;
    virt_addr2 = (unsigned long)ioremap((unsigned long)0x56000058,0x4);
    *(unsigned long *)virt_addr2&= 0x0f;//IO浣胯兘
   
    Major = register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);
    if(Major <0)
    {
        iounmap((void *)virt_addr0);
        iounmap((void *)virt_addr1);
        iounmap((void *)virt_addr2);
        printk("DRAM_MEM init_module:failed with %d ",Major);
        return Major;
    }
    Major = DRAM_MEM_MAJOR;
    printk("DRAM_MEM_MAJOR registred: Major = %d "  ,Major);
    return 0;
}

static int device_open(struct inode * inode,struct file *file)
{
    if(Device_Open)
    {
        return -EBUSY;
    }
    Device_Open++;
    MOD_INC_USE_COUNT;
    return SUCCESS;
}

static int device_release(struct inode * inode,struct file *file)
{
    Device_Open --;
    MOD_DEC_USE_COUNT;

    return 0;
}


#ifdef  MODULE
int init_module()
{

    return dram_mem_init();
}

void cleanup_module()
{
    int ret;
    iounmap((void *)virt_addr0);
    iounmap((void *)virt_addr1);
    iounmap((void *)virt_addr2);
    

    ret = unregister_chrdev(Major,DEVICE_NAME);
    if(ret < 0)
    {
        printk("unregister_chrdev:error %d ",ret);
    }  
}
#endif
 

相关帖子

来自 2楼
阿南| | 2007-6-13 18:10 | 只看该作者

re:

看楼主IO端口的寄存器0x56000050应该是2410的GPF口,这些寄存器的已经在kernel/include/asm-arm/arch-s3c2410/s3c2410.h中定义了,且在初始化时已申请了虚拟地址,直接用就可以了。
是不是动态装载的?再查看一下模块是否装载成功,或将IO的寄存器值打出看看

使用特权

评论回复
板凳
hlnzxl|  楼主 | 2007-6-13 17:51 | 只看该作者

驱动问题

使用特权

评论回复
地板
hlnzxl|  楼主 | 2007-6-13 22:11 | 只看该作者

re

是动态装载的,已经装载上啦,其中一个灯能驱动,其他三个灯不能驱动

使用特权

评论回复
5
阿南| | 2007-6-14 20:12 | 只看该作者

能驱动一个就好办啦,继续努力!

其它三个可能也就是控制寄存器的问题,把值打出来看看,或是你硬件有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

55

帖子

1

粉丝