gpiodrv.c 代码如下:<br />#include <linux/config.h><br />#include <linux/init.h><br />#include <linux/module.h><br />#include <linux/fs.h><br />#include <linux/iobuf.h><br />#include <linux/kernel.h><br />#include <linux/major.h><br />#include <asm/uaccess.h><br />#include <asm/io.h><br />#include <linux/vmalloc.h><br />#define IOPORT_MAJOR 220<br />#define GPFCON (*(volatile unsigned *)0x56000050) <br />#define GPFDAT (*(volatile unsigned *)0x56000054)<br />#define GPFUP (*(volatile unsigned *)0x56000058)<br />int gpio_open(struct inode *, struct file*);<br />int gpio_release(struct inode*, struct file*);<br />int gpio_ctl_ioctl(struct inode *, struct file*, unsigned int, unsigned long);<br />static struct file_operations gpio_ctl_fops = {<br /> ioctl : gpio_ctl_ioctl,<br /> open : gpio_open,<br /> release : gpio_release,<br />};<br />#define LED1_ON() (GPFDAT &= ~0X10)<br />#define LED1_OFF() (GPFDAT |= 0X10)<br />#define LED2_ON() (GPFDAT &= ~0X20)<br />#define LED2_OFF() (GPFDAT |= 0X20)<br />#define LED3_ON() (GPFDAT &= ~0X40)<br />#define LED3_OFF() (GPFDAT |= 0X40)<br />#define LED4_ON() (GPFDAT &= ~0X80)<br />#define LED4_OFF() (GPFDAT |= 0X80)<br />static int LedStatus;<br />void LedSet(int led)<br />{<br /> LedStatus = led;<br /> if(LedStatus & 0x01)<br /> LED1_ON();<br /> else<br /> LED1_OFF();<br />}<br /><br />void LedDisp(void)<br />{<br /> udelay(0x500000);<br /> LedSet(0x02);<br /> udelay(0x500000);<br /> LedSet(0x01);<br /><br />}<br /><br />static int __init gpio_init(void)<br />{ int err = 0;<br /> printk("gpio inint\n");<br /> err = register_chrdev(IOPORT_MAJOR, "gpio", &gpio_ctl_fops);<br /> if(err)<br /> {<br /> printk("fail to register\n");<br /> return -1;<br /> }<br /> printk("success to register \n");<br /> return 0;<br />}<br />int gpio_open(struct inode* inode, struct file* fllp)<br />{<br /> GPFCON = 0X5500;<br /> GPFUP = 0XFF;<br /> printk("open gpio devices\n");<br /> return 0;<br />}<br />int gpio_release(struct inode *inode, struct file* fillp)<br />{<br /> printk("release this device\n");<br /> return 0;<br />}<br />int gpio_ctl_ioctl(struct inode *inode, struct file *flip,unsigned \ <br /> int command, unsigned long arg)<br />{<br /> int err =0;<br /> if(command == 1)<br /> {<br /> while(arg--)<br /> {<br /> LedDisp();<br /> printk("......");<br /> }<br /> printk("\n");<br /> return 0;<br /> }<br /> return err;<br />}<br /><br /> module_init(gpio_init);<br /> module_exit(gpio_release);<br /><br />我的编译方法是:arm-linux-gcc -O2 -DMODULE -D__KERNEL__ -c gpiodrv.c<br />提示如下:<br />gpiodrv.c: In function `__cleanup_module_inline':<br />gpiodrv.c:113: warning: return from incompatible pointer type<br /><br />请问哪里出了问题,我看了半天也没看出问题出来,谢谢高手指教。<br /><br /> |
|