(4)x210: 2.4之前的字符驱动
2017-10-10 11:32
218 查看
1 chardev.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#define MYMAJOR 200
#define MYNAME "chardev"
static int test_chardev_open(struct inode *inode,struct file *file)
{
printk(KERN_INFO "test chardev_open\n");
return 0;
}
static int test_chardev_release(struct inode *inode,struct file *file){
printk(KERN_INFO "test chardev_relase\n");
return 0;
}
static const struct file_operations test_fops={
.owner=THIS_MODULE,
.open=test_chardev_open,
.release=test_chardev_release,
};
static int __init chardev_init(void)
{ int ret=-1;
printk(KERN_INFO "jimmy module chardev init");
ret=register_chrdev(MYMAJOR,MYNAME,&test_fops);
if(ret)
{
printk(KERN_ERR "register_chrdev fail\n");
return -EINVAL;
}
printk(KERN_INFO "register_chrdev success...\n");
return 0;
}
static void __exit chardev_exit(void)
printk(KERN_INFO "jimmy module chardev exit\n");
unregister_chrdev(MYMAJOR, MYNAME);
}
module_init(chardev_init);
module_exit(chardev_exit);
// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL"); // 描述模块的许可证
MODULE_AUTHOR("aston"); // 描述模块的作者
MODULE_DESCRIPTION("module test"); // 描述模块的介绍信息
MODULE_ALIAS("alias xxx"); // 描述模块的别名信息
2. app.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FILE "/dev/chardev" // mknod /dev/chardev c 2000 只要主设备号和驱动里定义的一样就可,名字可以和驱动里的MYNAME不同
int main(void)
{
int fd = -1;
fd = open(FILE, O_RDWR);
if (fd < 0)
{
printf("open %s error.\n", FILE);
return -1;
}
printf("open %s success..\n", FILE);
close(fd);
return 0;
}
3. Makefile
#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个
#KERN_VER = $(shell uname -r)
#KERN_DIR = /lib/modules/$(KERN_VER)/build
# 开发板的linux内核的源码树目录
KERN_DIR = /arm/s5pv210/kernel
obj-m += chardev.o
all:
make -C $(KERN_DIR) M=`pwd` modules
arm-none-linux-gnueabi-gcc app.c -o app -static // static编译,否则执行时会报错 " ./app not found"
cp:
cp *.ko /arm-nfs/jimmy_test
cp app /arm-nfs/jimmy_test
.PHONY: clean
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#define MYMAJOR 200
#define MYNAME "chardev"
static int test_chardev_open(struct inode *inode,struct file *file)
{
printk(KERN_INFO "test chardev_open\n");
return 0;
}
static int test_chardev_release(struct inode *inode,struct file *file){
printk(KERN_INFO "test chardev_relase\n");
return 0;
}
static const struct file_operations test_fops={
.owner=THIS_MODULE,
.open=test_chardev_open,
.release=test_chardev_release,
};
static int __init chardev_init(void)
{ int ret=-1;
printk(KERN_INFO "jimmy module chardev init");
ret=register_chrdev(MYMAJOR,MYNAME,&test_fops);
if(ret)
{
printk(KERN_ERR "register_chrdev fail\n");
return -EINVAL;
}
printk(KERN_INFO "register_chrdev success...\n");
return 0;
}
static void __exit chardev_exit(void)
printk(KERN_INFO "jimmy module chardev exit\n");
unregister_chrdev(MYMAJOR, MYNAME);
}
module_init(chardev_init);
module_exit(chardev_exit);
// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL"); // 描述模块的许可证
MODULE_AUTHOR("aston"); // 描述模块的作者
MODULE_DESCRIPTION("module test"); // 描述模块的介绍信息
MODULE_ALIAS("alias xxx"); // 描述模块的别名信息
2. app.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FILE "/dev/chardev" // mknod /dev/chardev c 2000 只要主设备号和驱动里定义的一样就可,名字可以和驱动里的MYNAME不同
int main(void)
{
int fd = -1;
fd = open(FILE, O_RDWR);
if (fd < 0)
{
printf("open %s error.\n", FILE);
return -1;
}
printf("open %s success..\n", FILE);
close(fd);
return 0;
}
3. Makefile
#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个
#KERN_VER = $(shell uname -r)
#KERN_DIR = /lib/modules/$(KERN_VER)/build
# 开发板的linux内核的源码树目录
KERN_DIR = /arm/s5pv210/kernel
obj-m += chardev.o
all:
make -C $(KERN_DIR) M=`pwd` modules
arm-none-linux-gnueabi-gcc app.c -o app -static // static编译,否则执行时会报错 " ./app not found"
cp:
cp *.ko /arm-nfs/jimmy_test
cp app /arm-nfs/jimmy_test
.PHONY: clean
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
相关文章推荐
- (5)x210:2.4之前的字符驱动-动态获得mymajor主设备号
- (7)x210:2.4之前的驱动--memdev模拟驱动-涉及阻塞
- (6)2.4之前的字符驱动-用devfs_register自动生成设备文件(可能在2.6linux目录树下编译不了)
- 自己写字符驱动示例linux2.4
- (10)x210: linux2.6之后的字符驱动
- 字符驱动设计文档
- linux下字符设备驱动的三种创建方式
- ok6410学习笔记(4.ioctl字符驱动)
- 字符设备驱动编写步骤
- Linux设备驱动学习(4)-字符设备驱动
- linux高级字符设备驱动(一 设备Ioctl控制)
- linux设备驱动学习(6) 高级字符驱动学习--阻塞型I/0
- 简单字符设备驱动代码+注释(ldd3第三章例子)
- 字符设备驱动在内核源码中的分析
- 国嵌内核驱动进阶班-7-3(阻塞型字符设备驱动)
- 《深入Linux设备驱动程序机制》学习心得---字符设备驱动原理图解
- fpga驱动1602液晶显示字符
- linux驱动模块开发(二)----字符设备驱动
- Linux字符设备驱动和杂项设备驱动对比
- Linux设备驱动程式学习(1)-字符设备驱动程式