Tiny6410下的第一个Linux驱动程序
Linux系统环境是照着友善之臂的教程搭建的
//Hello World驱动程序源文件
1 #include <linux/miscdevice.h> 2 #include <linux/delay.h> 3 #include <asm/irq.h> 4 5 #include <mach/hardware.h> 6 #include <linux/kernel.h> 7 #include <linux/module.h> 8 #include <linux/init.h> 9 #include <linux/mm.h> 10 #include <linux/fs.h> 11 #include <linux/types.h> 12 #include <linux/delay.h> 13 #include <linux/moduleparam.h> 14 #include <linux/slab.h> 15 #include <linux/errno.h> 16 #include <linux/ioctl.h> 17 #include <linux/cdev.h> 18 #include <linux/string.h> 19 #include <linux/list.h> 20 #include <linux/pci.h> 21 #include <asm/uaccess.h> 22 #include <asm/atomic.h> 23 #include <asm/unistd.h> 24 25 #include <mach/map.h> 26 #include <mach/regs-clock.h> 27 #include <mach/regs-gpio.h> 28 29 #include <plat/gpio-cfg.h> 30 #include <mach/gpio-bank-e.h> 31 #include <mach/gpio-bank-k.h> 32 #include <asm/io.h> 33 #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来编译
1 #include <sys/types.h> 2 3 #include <sys/stat.h> 4 5 #include <fcntl.h> 6 7 #include <stdio.h> 8 9 int main(int argc, char **argv) 10 { 11 int fd; 12 int val = 1; 13 fd = open("/dev/xxx", O_RDWR); 14 if (fd < 0) 15 { 16 printf("can't open!\n"); 17 } 18 19 write(fd, &val, 4); 20 return 0; 21 }
加载内核步骤
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 成功!