以下为例程(只是粗略写的,不能代一定能运行起来,实际情况按自己开发板与CPU进行修改)
/************************************************************************** 驱动框架 1、写出led_open、led_read 2、怎样告诉内核 a、定义一个file_operations b、把这个结构告诉内核register_chrdev c、谁来调用澹(这个称为驱动的入口函数) d、修饰 *******************************************************************************************/ #include<linux/module.h> #include<linux/kernel.h> #include<linux/fs.h> #include<linux/init.h> #include<linux/delay.h> #include<asm/uaccess.h> #include<asm/irq.h> #include<asm/io.h> #include<asm/arch/regs-gpio.h> #include<asm/hardware.h> /*打开设备函数*/ static int my_led_open(struct inode *inode,struct file *file) { printk("my_led here "); return 0; } /*设备写函数*/ static ssize_t my_led_write(struct file *file,const char __usr *buf,size_t count,loff_t *ppos) { printk("my_led out "); return 0; } /*定义一个file_operations结构*/ static struct file_operations my_led_fops={ .owner = THIS_MODULE, /*这是一个宏,推向编译模块时自动创建的__this_module变*/ .open = my_led_open, .open = my_led_write, }; int my_led_init(void)//入口函数 { register_chrdev(111,"my_led",&my_led_fops);//注册驱动 return 0; } int my_led_exit(void)//出口函数 { unregister_chrdev(111,"my_led");//注销驱动 return 0; } module_init(my_led_init);//修饰(即用一个宏来定义一个结构体) module_exit(my_led_init);//修饰(即用一个宏来定义一个结构体)
另应用层测试程序:
#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdio.h> int main(int argc,char **argv) { int fd; int val = 1; fd = open("/dev/my_led",O_RDWR); if(fd<0) printf("open err "); write(fd,&val,4); return 0; }
makefile请自行编写