1. 编写LED驱动(初始化所有子设备号)
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define GPBCON (0x56000010)
#define GPBDAT (0x56000014)
static unsigned int *regGPBCON;
static unsigned int *regGPBDAT;
int led_driver_open(struct inode *p_node, struct file *fp)
{
printk("open\n");
return 0;
}
ssize_t led_driver_read(struct file *fp, char __user *user_buffer, size_t n, loff_t * offset)
{
printk("read\n");
return 0;
}
void ledOn(unsigned int n)
{
*regGPBDAT |= (0x0F << 5);
if(n < 1 || n > 4)
{
return;
}
*regGPBDAT &= ~(1 << (n + 4));
}
ssize_t led_driver_write(struct file *fp, const char __user *user_buffer, size_t n, loff_t *offset)
{
char s[10];
copy_from_user(s, user_buffer, n);
ledOn(s[0]);
printk("write\n");
return n;
}
int led_driver_close(struct inode *p_node, struct file *fp)
{
printk("close\n");
return 0;
}
struct file_operations fops =
{
.owner = THIS_MODULE,
.release = led_driver_close,
.open = led_driver_open,
.read = led_driver_read,
.write = led_driver_write,
};
static int __init led_driver_init(void)
{
int ret;
printk("init\n");
ret = register_chrdev(200, "first driver", &fops);
if(ret != 0)
{
return ret;
}
regGPBCON = ioremap(GPBCON, 4);
regGPBDAT = ioremap(GPBDAT, 4);
*regGPBCON &= ~((3 << 10) | (3 << 12) | (3 << 14) | (3 << 16));
*regGPBCON |= (1 << 10) | (1 << 12) | (1 << 14) | (1 << 16);
*regGPBDAT |= (0x0F << 5);
return 0;
}
static void __exit led_driver_exit(void)
{
iounmap(regGPBDAT);
iounmap(regGPBCON);
unregister_chrdev(200, "first driver");
printk("exit\n");
}
module_init(led_driver_init);
module_exit(led_driver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("PuTe");
2. 编写LED驱动(初始化一个子设备号)
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define GPBCON (0x