- 论坛徽章:
- 0
|
本帖最后由 hgdyulei 于 2012-09-21 09:31 编辑
驱动程序:s2c2410-led.c
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/hardware.h>
#include <linux/devfs_fs_kernel.h>
#include <asm/delay.h>
#include <asm/uaccess.h>
#undef DEBUG
//#define DEBUG
#ifdef DEBUG
#define DPRINTK( x... ) printk("s3c2410-led: " ##x)
#else
#define DPRINTK( x... )
#endif
#define DEVICE_NAME "s3c2410-led"
#define DbLedRAW_MINOR 1
static int DbLedMajor = 0;
static int s3c2410_DbLed_open(struct inode *inode, struct file *filp)
{
MOD_INC_USE_COUNT;
GPDCON &=~ 0xffff;
GPDCON |= 0x5555;
GPECON &=~ 0xffff;
GPECON |= 0x5555;
GPCCON &=~ 0xffff0000;
GPCCON |= 0x55555555;
DPRINTK( "S3c2410 guet led device open!\n");
return 0;
}
static int s3c2410_DbLed_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
DPRINTK( "DbLed closed\n");
return 0;
}
static int s3c2410_DbLed_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned char arg)
{
switch(cmd){
case 1:
GPCDAT=arg<<8;
return 1;
case 2:
GPDDAT=arg;
return 1;
case 3:
GPEDAT=arg;
return 1;
}
return 0;
}
static struct file_operations s3c2410_fops = {
owner: THIS_MODULE,
open: s3c2410_DbLed_open,
ioctl: s3c2410_DbLed_ioctl,
release: s3c2410_DbLed_release,
};
#ifdef CONFIG_DEVFS_FS
static devfs_handle_t devfs_DbLed_dir, devfs_DbLedraw;
#endif
static int __init s3c2410_DbLed_init(void)
{
int ret;
ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);
if (ret < 0) {
printk(DEVICE_NAME " can't get major number\n");
return ret;
}
DbLedMajor = ret;
#ifdef CONFIG_DEVFS_FS
devfs_DbLed_dir = devfs_mk_dir(NULL, "led", NULL);
devfs_DbLedraw = devfs_register(devfs_DbLed_dir, "0", DEVFS_FL_DEFAULT,
DbLedMajor, DbLedRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,
&s3c2410_fops, NULL);
#endif
printk(DEVICE_NAME " initialized\n");
return 0;
}
module_init(s3c2410_DbLed_init);
#ifdef MODULE
static void __exit s3c2410_DbLed_exit(void)
{
#ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_DbLedraw);
devfs_unregister(devfs_DbLed_dir);
#endif
unregister_chrdev(DbLedMajor, DEVICE_NAME);
}
module_exit(s3c2410_DbLed_exit);
#endif
MODULE_LICENSE("GPL");
Makefile如下:
ifneq ($(KERNELRELEASE),)
obj-m := s3c2410-led.o
else
KERNEL_DIR :=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
endif
clean:
rm -f *.o *.ko *.mod.c .s3c2410-led*
编译结果:
root@debian:/home/user/1# make
make -C /lib/modules/2.6.26-2-686/build SUBDIRS=/home/user/1 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.26-2-686'
make[1]: *** 没有规则可以创建目标“modules”。 停止。
make[1]: Leaving directory `/usr/src/linux-headers-2.6.26-2-686'
make: *** [all] 错误 2
请问是什么原因?麻烦回答详细点,我还是个新手,谢谢!谢谢! |
|