head.h
#define PHY_LED1_MODER 0x50006000
#define PHY_LED1_ODR 0x50006014
#define PHY_RCC 0x50000A28
#define PHY_LED2_MODER 0x50007000
#define PHY_LED2_ODR 0x50007014
#define PHY_LED3_MODER 0x50006000
#define PHY_LED3_ODR 0x50006014
test.c
int main(int argc,char const *argv[])
int fd = open("/dev/mychrdev",O_RDWR);
printf("请输入要进行的操作:0(关灯) 1(开灯)>");
fgets(buf,sizeof(buf),stdin);
write(fd,buf,sizeof(buf));
demo.c
unsigned int *vir_led1_moder;
unsigned int *vir_led1_odr;
unsigned int *vir_led2_moder;
unsigned int *vir_led2_odr;
unsigned int *vir_led3_moder;
unsigned int *vir_led3_odr;
int mycdev_open(struct inode *inode, struct file *file)
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
ssize_t mycdev_read(struct file *file,char *ubuf,size_t size,loff_t *lof)
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
ret=copy_to_user(ubuf,kbuf,size);
printk("copy_to_user filed\n");
ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
ret=copy_from_user(kbuf,ubuf,size);
printk("copy_from_user filed\n");
(*vir_led1_odr) &= (~(0x1<<10));
(*vir_led1_odr) |= (0x1<<10);
(*vir_led2_odr) &= (~(0x1<<10));
(*vir_led2_odr) |= (0x1<<10);
(*vir_led3_odr) &= (~(0x1<<8));
(*vir_led3_odr) |= (0x1<<8);
int mycdev_close(struct inode *inode, struct file *file)
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
struct file_operations fops =
static int __init mycdev_init(void)
major = register_chrdev(0,"mychrdev",&fops);
printk("注册字符设备驱动成功major=%d\n",major);
vir_led1_moder = ioremap(PHY_LED1_MODER,4);
if(vir_led1_moder == NULL)
printk("物理内存地址映射失败%d\n",__LINE__);
vir_led1_odr = ioremap(PHY_LED1_ODR,4);
printk("物理内存地址映射失败%d\n",__LINE__);
vir_led2_moder = ioremap(PHY_LED2_MODER,4);
if(vir_led2_moder == NULL)
printk("物理内存地址映射失败%d\n",__LINE__);
vir_led2_odr = ioremap(PHY_LED2_ODR,4);
printk("物理内存地址映射失败%d\n",__LINE__);
vir_led3_moder = ioremap(PHY_LED3_MODER,4);
if(vir_led3_moder == NULL)
printk("物理内存地址映射失败%d\n",__LINE__);
vir_led3_odr = ioremap(PHY_LED3_ODR,4);
printk("物理内存地址映射失败%d\n",__LINE__);
vir_rcc = ioremap(PHY_RCC,4);
printk("物理内存地址映射失败%d\n",__LINE__);
(*vir_led1_moder) &= (~(0x3<<20));
(*vir_led1_moder) |= (0x1<<20);
(*vir_led1_odr) &= (~(0x1<<10));
(*vir_led2_moder) &= (~(0x3<<20));
(*vir_led2_moder) |= (0x1<<20);
(*vir_led2_odr) &= (~(0x1<<10));
(*vir_led3_moder) &= (~(0x3<<16));
(*vir_led3_moder) |= (0x1<<16);
(*vir_led3_odr) &= (~(0x1<<8));
static void __exit mycdev_exit(void)
unregister_chrdev(major,"mychrdev");
module_init(mycdev_init);
module_exit(mycdev_exit);

现象

