<br />LLeader(94125943) 20:48:49<br />我编写的LED驱动,其中寄存器的配置在ADS调试时没有问题。但是在linux操作系统里面,不能驱动,程序如下,请高手指教:<br />/*#define MODULE*/<br />#include <linux/kernel.h><br />#include <linux/module.h><br /><br />#include <asm/uaccess.h><br /><br /><br />#include <linux/mm.h><br />#include <linux/ioport.h><br /><br />#include <asm/io.h><br />#include <linux/ioport.h><br /><br /><br />#include <linux/fs.h><br />#include <linux/wrapper.h><br /><br /><br />#define DRAM_MEM_MAJOR 231<br />#define DEVICE_NAME "device_led"<br />#define SUCCESS 0<br /><br /><br /><br /><br />static int Device_Open = 0;<br /><br />int dram_mem_init(void);<br />static int device_open(struct inode *,struct file *);<br />static int device_release(struct inode *,struct file *);<br />static ssize_t device_write(struct file *,const char *,size_t,loff_t *);<br />int init_module(void);<br />void cleanup_module(void);<br /><br /><br />struct file_operations dram_mem_ops =<br />{<br /> read: device_read,<br /> write: device_write,<br /> open: device_open,<br /> release: device_release,<br />};<br /><br />static int Major;<br /><br />unsigned long virt_addr0; <br />unsigned long virt_addr1;<br />unsigned long virt_addr2;<br />int dram_mem_init(void)<br />{<br /><br /> <br /> virt_addr0 = (unsigned long)ioremap((unsigned long)0x56000050,0x4);<br /> *(unsigned long *)virt_addr0&= 0x00ff;//娓呴浂 <br /> *(unsigned long *)virt_addr0|= 0x5500;//杈撳嚭鏈夋晥<br /> virt_addr1 = (unsigned long)ioremap((unsigned long)0x56000054,0x4);<br /> *(unsigned long *)virt_addr1=0x0;<br /> virt_addr2 = (unsigned long)ioremap((unsigned long)0x56000058,0x4);<br /> *(unsigned long *)virt_addr2&= 0x0f;//IO浣胯兘<br /> <br /> Major = register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);<br /> if(Major <0)<br /> {<br /> iounmap((void *)virt_addr0);<br /> iounmap((void *)virt_addr1);<br /> iounmap((void *)virt_addr2);<br /> printk("DRAM_MEM init_module:failed with %d
",Major);<br /> return Major;<br /> }<br /> Major = DRAM_MEM_MAJOR;<br /> printk("DRAM_MEM_MAJOR registred: Major = %d
" ,Major);<br /> return 0;<br />}<br /><br />static int device_open(struct inode * inode,struct file *file)<br />{<br /> if(Device_Open)<br /> {<br /> return -EBUSY;<br /> }<br /> Device_Open++;<br /> MOD_INC_USE_COUNT;<br /> return SUCCESS;<br />}<br /><br />static int device_release(struct inode * inode,struct file *file)<br />{<br /> Device_Open --;<br /> MOD_DEC_USE_COUNT;<br /><br /> return 0;<br />}<br /><br /><br />#ifdef MODULE<br />int init_module()<br />{<br /><br /> return dram_mem_init();<br />}<br /><br />void cleanup_module()<br />{<br /> int ret;<br /> iounmap((void *)virt_addr0);<br /> iounmap((void *)virt_addr1);<br /> iounmap((void *)virt_addr2);<br /> <br /><br /> ret = unregister_chrdev(Major,DEVICE_NAME);<br /> if(ret < 0)<br /> {<br /> printk("unregister_chrdev:error %d
",ret);<br /> } <br />}<br />#endif<br /> |
|