.实现LED1/LED2/LED3三盏灯进行点亮
内核驱动文件:
#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/uaccess.h>
#include<linux/io.h>
#include"myled.h"
#define CNAME "myled"
int major;
char kbuf[128]={0};
unsigned int* rcc = NULL;
unsigned int* mode = NULL;
unsigned int* odre = NULL;
unsigned int* odrf = NULL;
int myled_open(struct inode *inode, struct file *file)
{
//printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
return 0;
}
ssize_t myled_read (struct file *file, char __user *ubuf, size_t size, loff_t *loff)
{
int ret;
//printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
if(size > sizeof(kbuf))
size = sizeof(kbuf);
ret = copy_to_user(ubuf,kbuf,size);
if(ret)
{
printk("copy_to_user default\n");
return -EIO;
}
return 0;
}
ssize_t myled_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loff)
{
int ret;
//printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
if(size > sizeof(kbuf))
size=sizeof(kbuf);
ret = copy_from_user(kbuf,ubuf,size);
if(ret)
{
printk("copy_from_user default\n");
return -EIO;
}
if(kbuf[0] == 0)
{
*odre &= (~(0x1 << 10));//LED1灭
*odre &= (~(0x1 << 8));//LED3灭
*odrf &= (~(0x1 << 10));//LED2灭
}
else
{
*odre |= (0x1 << 10);//LED1亮
*odre |= (0x1 << 8);//LED3亮
*odrf |= (0x1 << 10);//LED2亮
}
return ret;
}
int myled_close (struct inode *inode, struct file *file)
{
//printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
return 0;
}
static const struct file_operations fops = {
.open = myled_open,
.write = myled_write,
.read = myled_read,
.release = myled_close,
};
static int __init myled_init(void)
{
major = register_chrdev(0,CNAME,&fops);
if(major < 0)
{
printk("register_chrdev ERROR\n");
}
printk("major = %d\n",major);
//RCC章节初始化
rcc = ioremap(RCC,4);
*rcc |= (0x3 << 4);
//PE10初始化
mode = ioremap(GPIOE_MODE,4);
*mode |= (0x1 << 20);//输出模式
odre = ioremap(GPIOE_ODR,4);
*odre &= (~(0x1 << 10));
//PE8初始化
*mode |= (0x1 << 16);
*odre &= (~(0x1 << 8));
//PF10初始化
mode = ioremap(GPIOF_MODE,4);
*mode |= (0x1 << 20);
odrf = ioremap(GPIOF_ODR,4);
*odrf &= (~(0x1 << 10));
return 0;
}
static void __exit myled_exit(void)
{
unregister_chrdev(major,CNAME);
}
module_init(myled_init);
module_exit(myled_exit);
MODULE_LICENSE("GPL");
头文件:
#ifndef __MYLED_H__
#define __MYLED_H__
#define RCC 0x50000A28
#define GPIOE_MODE 0x50006000
#define GPIPE_ODR 0x50006014
#define GPIOF_MODE 0x50007000
#define GPIOF_ODR 0x50007014
#endif
执行文件:
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char buffer[30]={0};
int fd = open("/dev/mycdev",O_RDWR);
if(fd < 0)
{
perror("open is error\n");
return 0;
}
while(1)
{
buffer[0] = !buffer[0];
write(fd,buffer,sizeof(buffer));
sleep(1);
}
close(fd);
return 0;
}