在此文档的指导下写出linux步进电机驱动的前提是:
1、懂得linux内核模块编程。
2、明白步进电机的原理及驱动电路。
3、能在51单片机(或其他的CPU)下驱动步进电机。
一:运行环境
硬件平台:tq2440开发板(CPU,s3c2440)
软件平台:linux2.6.30.4内核
编译工具:arm-linux-gcc交叉编译器
二:跟驱动相关的基本内核函数
1、动态分配设备号
Int alloc_chrdev_region(dev_t *dev, unsigned int baseminor, unsigned int count, const char *name)
dev:用于存放分配到的设备号
baseminor:要注册的次设备号的起始值
count:要注册的设备号个数
name:设备名称
返回值:0表示成功,负数为错误码
2、注销设备号
Void unregister_chrdev_region(dev_t from, unsigned int count)
from:要注销的设备号的起始值
count:要注销的设备号个数
3、创建字符设备并初始化
在驱动中,字符设备其实就是个结构体,如下
struct cdev {
const struct file_operations *ops; //指向对该设备的操作结构体
/*其结构体成员有很多,这里只列出其中很重要的一个*/
}
struct file_operations {
struct module *owner; //一般为THIS_MODULE
ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
ssize_t (*write)(struct file *, char __user *, size_t, loff_t *);
int (*open)(struct inode *, struct file *);
int (*release)(struct inode *, struct file *);
int (*ioctl)( struct inode *, struct file *, unsigned int, long );
/*这里知识列出部分成员*/
}
void cdev_init(struct *cdev, const struct file_operations *fops)
cdev:指向被初始化的字符设备
fops:指向字符设备支持的一系列文件操作
4、注册字符设备
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
p:指向要注册的字符设备
dev:此字符设备要绑定的设备号的起始值
count:此字符设备要绑定的设备号的个数
返回值:0表示注册成功,负数表示错误码
5、注销字符设备
void cdev_del(struct cdev *p)
p:指向被注销的字符设备
6、struct file_operations成员函数与应用层的联系
当应用程序调用open(),close(),read(),write(),ioctl()等时,系统调用会转去调用对应驱动的struct file_operations中的open(),release(),read(),write(),ioctl()等。
三、操作ARM的GPIO的内核函数
在步进电机驱动(驱动电路方案是L297+L298)中,引脚使用情况是GPF3对应着驱动电路的时钟口,GPF4对应着驱动电路的使能口