智能家居窗帘步进电机驱动程序:
1. 本驱动使用platform模型进行设计,分为Stepper_Motor_device和Stepper_Motor_driver两个文件
2. 注册杂项设备(misc),主设备号固定是10(misc),从设备号由系统自动分配,加载成功后使用lsmod可以看到:
Stepper_Motor_device
Stepper_Motor_driver
Stepper_Motor_driver
3. 加载driver驱动模块之后初始化成功会输出:
[ 36.605575] entering Stepper_Motor_driver_init
[ 36.605702] entering Stepper_Motor_dirver_probe
[ 36.605702] entering Stepper_Motor_dirver_probe
4. 本驱动注册成功后生成 /dev/smarthome_steppermotor_control 节点
5. 对 smarthome_lightcontrol 设备节点的操作主要有:
1)打开操作open:打开文件过程中会对GPIO进行初始化
[ 36.609147] Stepper_Motor_dirver_open: gpio init finished!!! //GPIO初始化成功
2)关闭操作close:关闭文件过程中会将用到的所有GPIO置低电平
3) 对文件的读操作read,使用方法:
先定义这样一个结构体类型的变量
1)打开操作open:打开文件过程中会对GPIO进行初始化
[ 36.609147] Stepper_Motor_dirver_open: gpio init finished!!! //GPIO初始化成功
2)关闭操作close:关闭文件过程中会将用到的所有GPIO置低电平
3) 对文件的读操作read,使用方法:
先定义这样一个结构体类型的变量
static struct motor_info{
unsigned short step_long; //步进电机的步长信息
unsigned short one_round; //步进电机转动一周所需的控制脉冲数
unsigned short pulse_period; //步进电机脉冲周期
unsigned short max_position; //步进电机最大位置(放下窗帘的最大值)
unsigned short one_round; //步进电机转动一周所需的控制脉冲数
unsigned short pulse_period; //步进电机脉冲周期
unsigned short max_position; //步进电机最大位置(放下窗帘的最大值)
/****** this is important *****/
unsigned short current_position; //步进电机当前的位置值(步进电机每转动一周,该位置值就会加1或减1)
unsigned short current_position; //步进电机当前的位置值(步进电机每转动一周,该位置值就会加1或减1)
/****************************/
unsigned short min_position; //步进电机最小位置 (收起窗帘的最小值)
};
然后把这个结构的地址放到read函数里面作为缓冲区,对驱动文件进行读操作,就可获得驱动里面包含的关于步进电机的信息。
4)发送命令ioctl:这里使用了_IO的办法对命令进行加密
unsigned short min_position; //步进电机最小位置 (收起窗帘的最小值)
};
然后把这个结构的地址放到read函数里面作为缓冲区,对驱动文件进行读操作,就可获得驱动里面包含的关于步进电机的信息。
4)发送命令ioctl:这里使用了_IO的办法对命令进行加密
#define MAGIC_WORD 'P'
#define STEPPER_MOTOR_DOWN_A_STEP _IO(MAGIC_WORD,11) //步进电机正转1周
#define STEPPER_MOTOR_UP_A_STEP _IO(MAGIC_WORD,21) //步进电机反转1周
#define STEPPER_MOTOR_UP_A_STEP _IO(MAGIC_WORD,21) //步进电机反转1周
在ioctl操作过程中,会使用互斥锁对驱动文件进行上锁,避免其他进程或线程同时进行ioctl,打乱时序。操作完成后会解锁。
6. 重构了整个室内机驱动的框架
6. 重构了整个室内机驱动的框架
模块单独调试时请将driver文件里面的SINGLE_MODULE宏修改为1(独立申请内存)
整体调试时请将driver文件里面的SINGLE_MODULE宏修改为0(内存由框架代码统一申请)
整体调试时请将driver文件里面的SINGLE_MODULE宏修改为0(内存由框架代码统一申请)
7. 开启模块调试信息请将driver文件里面的DEBUG宏修改为1,关闭设为0。
Stepper_Motor_device.c
#include <asm/uaccess.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#define S5PV210_GPH_BASE 0xe0200c00 //read the s5pv210 datasheet!
#define GPH_SIZE 0x6c
void Stepper_Motor_device_release(struct device * pdev);
struct StepperMotor_Plat_Data{
unsigned short step_long;
unsigned short one_round;
unsigned short pulse_period;
unsigned short max_position;
unsigned short current_position;
unsigned short min_position;
};
#define PULSE_PERIOD 25 //ms
#define HIGH_LEVEL_TIME PULSE_PERIOD
#define LOW_LEVEL_TIME (