项目中经常会使用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