linux之点亮led灯出现的无效操作数&问题

linux中点亮led灯时出现无效操作数的错误,源代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


volatile unsigned long gpbcon = NULL;
volatile unsigned long *gpbdat = NULL;


static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;


int first_drv_open(struct inode *inode, struct file *file)
{
gpbcon &= ~((0x3<<(5*2))|(0x3<<(6*2))|(0x3<<(7*2))|(0x3<<(8*2)));
gpbcon |= ((0x1<<(5*2))|(0x1<<(6*2))|(0x1<<(7*2))|(0x1<<(8*2)));
//printk("first_drv_open\n");
return 0;
}
ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
int val;

copy_from_user(&val,buf,count);

if (val ==1)
{
gpbdat &= ~((0x1<<5)|(0x1<<6)|(0x1<<7)|(0x1<<8));
}
else
{
gpbdat |= ((0x1<<5)|(0x1<<6)|(0x1<<7)|(0x1<<8));
}
//printk("first_drv_write\n");
return 0;
}


struct file_operations first_drv_fops={


.owner = THIS_MODULE,
.write = first_drv_write,
.open = first_drv_open,
};


int major;
int first_drv_init(void)
{
major = register_chrdev(0,"first_drv",&first_drv_fops); //注册 告诉内核
firstdrv_class = class_create(THIS_MODULE,"firstdrv");
/*if (IS_ERR(firstdrv_class))
return PTR_ERR(firstdrv_class);*/

firstdrv_class_dev = class_device_create(firstdrv_class,NULL,MKDEV(major,0),NULL,"xyz");
/*if (unlikely(IS_ERR(firstdrv_class_dev)))
return PTR_ERR(firstdrv_class_dev);*/

*gpbcon = (volatile unsigned long *)ioremap(0x56000010,16);
*gpbdat= (volatile unsigned long *)ioremap(0x56000014,16);
return 0;
}


void first_drv_exit(void)
{
unregister_chrdev(major,"first_drv"); //卸载
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
iounmap(gpbcon);
iounmap(gpbdat);
}


module_init(first_drv_init);
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");

运行结果如下:

book@book-desktop:/lesson/lesson0$ make
make -C /work/system/linux-2.6.22.6 M=`pwd` modules 
make[1]: Entering directory `/work/system/linux-2.6.22.6'
  CC [M]  /lesson/lesson0/first_drv.o
/lesson/lesson0/first_drv.c: In function `first_drv_open':
/lesson/lesson0/first_drv.c:24: error: invalid operands to binary &
/lesson/lesson0/first_drv.c:25: error: `gpbcon' undeclared (first use in this function)
/lesson/lesson0/first_drv.c:25: error: (Each undeclared identifier is reported only once
/lesson/lesson0/first_drv.c:25: error: for each function it appears in.)
/lesson/lesson0/first_drv.c: In function `first_drv_write':
/lesson/lesson0/first_drv.c:37: error: invalid operands to binary &
/lesson/lesson0/first_drv.c:41: error: invalid operands to binary |
/lesson/lesson0/first_drv.c: In function `first_drv_init':
/lesson/lesson0/first_drv.c:58: warning: implicit declaration of function `class_create'
/lesson/lesson0/first_drv.c:58: warning: assignment makes pointer from integer without a cast
/lesson/lesson0/first_drv.c:62: warning: implicit declaration of function `class_device_create'
/lesson/lesson0/first_drv.c:62: warning: assignment makes pointer from integer without a cast
/lesson/lesson0/first_drv.c:66: error: `gpbcon' undeclared (first use in this function)
/lesson/lesson0/first_drv.c:67: warning: assignment makes integer from pointer without a cast
/lesson/lesson0/first_drv.c: In function `first_drv_exit':
/lesson/lesson0/first_drv.c:74: warning: implicit declaration of function `class_device_unregister'
/lesson/lesson0/first_drv.c:75: warning: implicit declaration of function `class_destroy'
/lesson/lesson0/first_drv.c:76: error: `gpbcon' undeclared (first use in this function)
/lesson/lesson0/first_drv.c:82:23: warning: no newline at end of file
/lesson/lesson0/first_drv.c: In function `first_drv_write':
/lesson/lesson0/first_drv.c:33: warning: ignoring return value of `copy_from_user', declared with attribute warn_unused_result
make[2]: *** [/lesson/lesson0/first_drv.o] Error 1
make[1]: *** [_module_/lesson/lesson0] Error 2
make[1]: Leaving directory `/work/system/linux-2.6.22.6'
make: *** [all] Error 2


上面数24.25.37.47无效的操作数错误


认真阅读代码 发现 代码中的gpbcon和gpbdat为地址,给其赋值是前面应该加“*”号,加上之后保存运行正确!

你可能感兴趣的:(mini2440错误)