[Linux字符驱动] DIDO 74HC595实现遥控遥信功能

项目中经常会使用YK和YX功能,DI操作,简单来说就是外部输入高电平,软件检测信号就为1;外部信号输入低电平,软件检测信号就为0;依据这样的设计,我们来看一下字符驱动该如何完成。

下面介绍一种有IO控制和74HC595扩展控制DO的混合YK;

为什么要加74HC595芯片?

1、CPU的关键不够用

2、锁存作用,595是一种移位的锁存器,就是CPU程序复位后,锁存外部的状态不发送变化;比如:外部接触器断开时序有要求;

在这里插入图片描述

字符驱动的模型还是套用gpio系统;

1、模块的入口函数

module_init(at91_dido_init);
module_exit(at91_dido_cleanup);


MODULE_DESCRIPTION ("AT91 dido DRIVER"); 
MODULE_VERSION(DRV_VERSION);
MODULE_AUTHOR ("Jack"); 
MODULE_LICENSE ("GPL");

2、创建init和cleanup函数
定义初始化信息, 定义YK YX控制的结构体

struct dido_pin
{
   
 ulong DI_YX[MAX_YX_NUMBER];/*PA0~PA7*//*PE8~PE10*/
 ulong pin_shcp;  //shift register clock input
 ulong pin_stcp;  //storage register clock input
 ulong pin_ds;   //serial data input
};

struct St_dido
{
   
 dev_t dev_major;
 char di_stat[MAX_YK_NUMBER];
 char do_stat[MAX_YK_NUMBER];//目前为一一对应关系
 struct dido_pin Dido_pin;
 atomic_t open_count;
 struct mutex dido_mudex;//互斥锁
 struct cdev dido_dev;//
 struct class *dido_class;
 struct device *dido_device;
};

3、注册及注销驱动流程
定义YX对应的硬件管脚和595控制管脚

static int __init at91_dido_init(void)
{
    
 int retval = -1;
 int inum = 0;
 dev_t dev_id;
 
 // 分配一个结构
 pdido = (struct St_dido *)kzalloc(sizeof (struct St_dido),GFP_KERNEL);
 if(!pdido)
 {
   
  printk("%s:kzalloc failded from:%s\n", __func__,DIDO_DETECT_NAME);
  return -ENOMEM;
 }

 //init low dido pin
 for( inum=0; inum < 6; inum ++ )
 {
   
  pdido->Dido_pin.DI_YX[inum] = AT91_PIN_PE0+inum;
 }

 pdido->Dido_pin.DI_YX[6]  = AT91_PIN_PC16;
 pdido->Dido_pin.DI_YX[7]  = AT91_PIN_PC21;

 pdido->Dido_pin.pin_shcp  = AT91_PIN_PD28;
 pdido->Dido_pin.pin_stcp  = AT91_PIN_PD31;
 pdido->Dido_pin.pin_ds   = AT91_PIN_PD19;
 
 //printk("dido_pin:green:%d\n",pwdt->wdg_pin);
 mutex_init(&(pdido->dido_mudex));
 //pwdt->open_count = ATOMIC_INIT(0);//初始化为0

 //分配主设备号
 if (dido
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值