驱动问题

[复制链接]
2278|4
 楼主| hlnzxl 发表于 2007-6-12 20:57 | 显示全部楼层 |阅读模式
vi, ic, ST, ev, ce
<br />LLeader(94125943)&nbsp;20:48:49<br />我编写的LED驱动,其中寄存器的配置在ADS调试时没有问题。但是在linux操作系统里面,不能驱动,程序如下,请高手指教:<br />/*#define&nbsp;MODULE*/<br />#include&nbsp;&ltlinux/kernel.h&gt<br />#include&nbsp;&ltlinux/module.h&gt<br /><br />#include&nbsp;&ltasm/uaccess.h&gt<br /><br /><br />#include&nbsp;&ltlinux/mm.h&gt<br />#include&nbsp;&ltlinux/ioport.h&gt<br /><br />#include&nbsp;&ltasm/io.h&gt<br />#include&nbsp;&ltlinux/ioport.h&gt<br /><br /><br />#include&nbsp;&ltlinux/fs.h&gt<br />#include&nbsp;&ltlinux/wrapper.h&gt<br /><br /><br />#define&nbsp;DRAM_MEM_MAJOR&nbsp;231<br />#define&nbsp;DEVICE_NAME&nbsp;&nbsp;&quot;device_led&quot;<br />#define&nbsp;SUCCESS&nbsp;&nbsp;&nbsp;0<br /><br /><br /><br /><br />static&nbsp;int&nbsp;Device_Open&nbsp;=&nbsp;0;<br /><br />int&nbsp;dram_mem_init(void);<br />static&nbsp;int&nbsp;device_open(struct&nbsp;inode&nbsp;*,struct&nbsp;file&nbsp;*);<br />static&nbsp;int&nbsp;device_release(struct&nbsp;inode&nbsp;*,struct&nbsp;file&nbsp;*);<br />static&nbsp;ssize_t&nbsp;device_write(struct&nbsp;file&nbsp;*,const&nbsp;char&nbsp;*,size_t,loff_t&nbsp;*);<br />int&nbsp;init_module(void);<br />void&nbsp;cleanup_module(void);<br /><br /><br />struct&nbsp;file_operations&nbsp;&nbsp;dram_mem_ops&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_read,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_write,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;device_open,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;release:&nbsp;&nbsp;&nbsp;device_release,<br />};<br /><br />static&nbsp;int&nbsp;Major;<br /><br />unsigned&nbsp;long&nbsp;virt_addr0;&nbsp;<br />unsigned&nbsp;long&nbsp;virt_addr1;<br />unsigned&nbsp;long&nbsp;virt_addr2;<br />int&nbsp;dram_mem_init(void)<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;virt_addr0&nbsp;=&nbsp;(unsigned&nbsp;long)ioremap((unsigned&nbsp;long)0x56000050,0x4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(unsigned&nbsp;long&nbsp;*)virt_addr0&=&nbsp;0x00ff;//娓呴浂&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(unsigned&nbsp;long&nbsp;*)virt_addr0|=&nbsp;0x5500;//杈撳嚭鏈夋晥<br />&nbsp;&nbsp;&nbsp;&nbsp;virt_addr1&nbsp;=&nbsp;(unsigned&nbsp;long)ioremap((unsigned&nbsp;long)0x56000054,0x4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(unsigned&nbsp;long&nbsp;*)virt_addr1=0x0;<br />&nbsp;&nbsp;&nbsp;&nbsp;virt_addr2&nbsp;=&nbsp;(unsigned&nbsp;long)ioremap((unsigned&nbsp;long)0x56000058,0x4);<br />&nbsp;&nbsp;&nbsp;&nbsp;*(unsigned&nbsp;long&nbsp;*)virt_addr2&=&nbsp;0x0f;//IO浣胯兘<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Major&nbsp;=&nbsp;register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(Major&nbsp;&lt0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iounmap((void&nbsp;*)virt_addr0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iounmap((void&nbsp;*)virt_addr1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iounmap((void&nbsp;*)virt_addr2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;DRAM_MEM&nbsp;init_module:failed&nbsp;with&nbsp;%d
&quot;,Major);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Major;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Major&nbsp;=&nbsp;DRAM_MEM_MAJOR;<br />&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;DRAM_MEM_MAJOR&nbsp;registred:&nbsp;Major&nbsp;=&nbsp;%d
&quot;&nbsp;&nbsp;,Major);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />static&nbsp;int&nbsp;device_open(struct&nbsp;inode&nbsp;*&nbsp;inode,struct&nbsp;file&nbsp;*file)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(Device_Open)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-EBUSY;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Device_Open++;<br />&nbsp;&nbsp;&nbsp;&nbsp;MOD_INC_USE_COUNT;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SUCCESS;<br />}<br /><br />static&nbsp;int&nbsp;device_release(struct&nbsp;inode&nbsp;*&nbsp;inode,struct&nbsp;file&nbsp;*file)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Device_Open&nbsp;--;<br />&nbsp;&nbsp;&nbsp;&nbsp;MOD_DEC_USE_COUNT;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br /><br />#ifdef&nbsp;&nbsp;MODULE<br />int&nbsp;init_module()<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dram_mem_init();<br />}<br /><br />void&nbsp;cleanup_module()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;iounmap((void&nbsp;*)virt_addr0);<br />&nbsp;&nbsp;&nbsp;&nbsp;iounmap((void&nbsp;*)virt_addr1);<br />&nbsp;&nbsp;&nbsp;&nbsp;iounmap((void&nbsp;*)virt_addr2);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;unregister_chrdev(Major,DEVICE_NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(ret&nbsp;&lt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(&quot;unregister_chrdev:error&nbsp;%d
&quot;,ret);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />}<br />#endif<br />&nbsp;
阿南 发表于 2007-6-13 18:10 | 显示全部楼层

re:

看楼主IO端口的寄存器0x56000050应该是2410的GPF口,这些寄存器的已经在kernel/include/asm-arm/arch-s3c2410/s3c2410.h中定义了,且在初始化时已申请了虚拟地址,直接用就可以了。<br />是不是动态装载的?再查看一下模块是否装载成功,或将IO的寄存器值打出看看
 楼主| hlnzxl 发表于 2007-6-13 17:51 | 显示全部楼层

驱动问题

  
 楼主| hlnzxl 发表于 2007-6-13 22:11 | 显示全部楼层

re

是动态装载的,已经装载上啦,其中一个灯能驱动,其他三个灯不能驱动
阿南 发表于 2007-6-14 20:12 | 显示全部楼层

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

其它三个可能也就是控制寄存器的问题,把值打出来看看,或是你硬件有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

55

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部