[嵌入式Linux驱动]S5PV210的步进电机Linux驱动程序

智能家居窗帘步进电机驱动程序:
1. 本驱动使用platform模型进行设计,分为Stepper_Motor_device和Stepper_Motor_driver两个文件

2. 注册杂项设备(misc),主设备号固定是10(misc),从设备号由系统自动分配,加载成功后使用lsmod可以看到:
     Stepper_Motor_device
     Stepper_Motor_driver

3. 加载driver驱动模块之后初始化成功会输出:
     [   36.605575] entering Stepper_Motor_driver_init
     [   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,使用方法:
 
  先定义这样一个结构体类型的变量
  
static struct motor_info{
     unsigned short step_long;   //步进电机的步长信息
     unsigned short one_round;   //步进电机转动一周所需的控制脉冲数
     unsigned short pulse_period;  //步进电机脉冲周期
     unsigned short max_position;  //步进电机最大位置(放下窗帘的最大值)
    
     /****** this is important *****/
     unsigned short current_position; //步进电机当前的位置值(步进电机每转动一周,该位置值就会加1或减1)
   
     /****************************/
     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周
 在ioctl操作过程中,会使用互斥锁对驱动文件进行上锁,避免其他进程或线程同时进行ioctl,打乱时序。操作完成后会解锁。
 
 
6. 重构了整个室内机驱动的框架
 模块单独调试时请将driver文件里面的SINGLE_MODULE宏修改为1(独立申请内存)
 整体调试时请将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 	(
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值