Tiny6410下的第一个Linux驱动程序
2014-12-16 18:41
302 查看
Linux系统环境是照着友善之臂的教程搭建的
//Hello World驱动程序源文件
//驱动读函数
static int first_drv_open(struct inode *inode, struct file
*file)
{
printk("Hello Driver\n");
return
0;
}
//驱动写函数
static ssize_t first_drv_write(struct file *file,
const char __user *buf, size_t count, loff_t * ppos)
{
printk("Hello
World\n");
return 0;
}
//定义file_operations结构体
static struct
file_operations first_drv_fops =
{
.owner = THIS_MODULE,
//这是一个宏,推向编译模块时自动创建的__this_module变量
.open = first_drv_open,
.write = first_drv_write,
};
//驱动入口函数
static int
first_drv_init(void)
{
register_chrdev(111, "first_drv",
&first_drv_fops);//向内核注册驱动
return 0;
}
static void
first_drv_exit(void)
{
unregister_chrdev(111, "first_drv");
//卸载驱动
}
module_init(first_drv_init);//定义一个结构体,供内核调用入口函数(first_drv_init--函数指针)
module_exit(first_drv_exit);//
Makefile文件
//测试驱动的程序
//测试程序要用arm-linux-gcc来编译
加载内核步骤
1、将编译好的驱动文件--first_drv.ko 和测试程序--firstdevtest 发送到Tiny6410上。
2、执行命令 insmod first_drv.ko //加载内核驱动 使用 cat /proc/devices 命令查看加载的驱动
3、执行命令 mknod /dev/xxx c 111 0 //创建设备节点 在/dev目录下生成xxx文件 主设备号为111 次设备号为0
4、执行命令 ./firstdrvtest //执行测试程序 出现Hello Wrold 成功!
//Hello World驱动程序源文件
#include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <mach/hardware.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/delay.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/string.h> #include <linux/list.h> #include <linux/pci.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <asm/unistd.h> #include <mach/map.h> #include <mach/regs-clock.h> #include <mach/regs-gpio.h> #include <plat/gpio-cfg.h> #include <mach/gpio-bank-e.h> #include <mach/gpio-bank-k.h> #include <asm/io.h> #include <linux/device.h>
//驱动读函数
static int first_drv_open(struct inode *inode, struct file
*file)
{
printk("Hello Driver\n");
return
0;
}
//驱动写函数
static ssize_t first_drv_write(struct file *file,
const char __user *buf, size_t count, loff_t * ppos)
{
printk("Hello
World\n");
return 0;
}
//定义file_operations结构体
static struct
file_operations first_drv_fops =
{
.owner = THIS_MODULE,
//这是一个宏,推向编译模块时自动创建的__this_module变量
.open = first_drv_open,
.write = first_drv_write,
};
//驱动入口函数
static int
first_drv_init(void)
{
register_chrdev(111, "first_drv",
&first_drv_fops);//向内核注册驱动
return 0;
}
static void
first_drv_exit(void)
{
unregister_chrdev(111, "first_drv");
//卸载驱动
}
module_init(first_drv_init);//定义一个结构体,供内核调用入口函数(first_drv_init--函数指针)
module_exit(first_drv_exit);//
Makefile文件
obj-m += first_drv.o #制定目标名 KDIR = /opt/FriendlyARM/mini6410/linux/linux-2.6.38 #指定内核路径 all : make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm clean : rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order
//测试驱动的程序
//测试程序要用arm-linux-gcc来编译
#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/xxx", O_RDWR); if (fd < 0) { printf("can't open!\n"); } write(fd, &val, 4); return 0; }
加载内核步骤
1、将编译好的驱动文件--first_drv.ko 和测试程序--firstdevtest 发送到Tiny6410上。
2、执行命令 insmod first_drv.ko //加载内核驱动 使用 cat /proc/devices 命令查看加载的驱动
3、执行命令 mknod /dev/xxx c 111 0 //创建设备节点 在/dev目录下生成xxx文件 主设备号为111 次设备号为0
4、执行命令 ./firstdrvtest //执行测试程序 出现Hello Wrold 成功!
相关文章推荐
- Tiny6410 我的第一个嵌入式Linux驱动程序模块
- 第一个LINUX下的驱动程序
- 第二章 第二节 Linux设备驱动程序之--我的第一个程序 Hello World
- 【转】第一个Linux内核驱动程序
- 我的第一个Linux开发板字符驱动程序
- linux驱动由浅入深系列:驱动程序的基本结构概览之一(第一个驱动程序)
- LINUX2.6.26.6内核下的第一个LED驱动程序测试成功!
- 开发板上使用GPIO向电磁继电器发送高低电平控制台灯亮灭(我的第一个linux驱动程序开发)
- 第一个linux驱动程序
- 嵌入式Linux驱动笔记(一)------第一个LED驱动程序
- linux下的第一个驱动程序 hello (for 2.4)
- 第一个Linux内核驱动程序
- tiny6410上第一个hello module驱动程序
- linux设备驱动程序学习笔记--第一个有用的驱动
- 【Linux驱动】第一个驱动程序
- 第一个嵌入式Linux的驱动程序
- linux2.6 驱动开发入门:第一个驱动程序
- 手把手教你写第一个Linux驱动程序
- 嵌入式Linux驱动学习笔记(一)------第一个LED驱动程序
- Linux驱动程序开发之三----按键驱动(Tiny6410)