NUC980驱动595与165扩展输入输出接口

Linux驱动程序:24路光耦输入与8路继电器输出设计
该代码实现了一个基于Linux内核的驱动程序,用于管理24路光耦合器输入和8路继电器输出。它使用了硬件实时定时器(hrtimer)进行周期性任务,并通过GPIO控制信号。程序还包括一个简单的用户空间应用示例,用于读写设备节点进行通信。

一、电路图
3个165串联组成扩展24路光耦输入检测,一个595扩展8路继电器输出
在这里插入图片描述
二、驱动源码

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/device.h>

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>//jiffies在此头文件中定义
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/timer.h>

#include <linux/gpio.h>
#include <mach/gpio.h>
#include <linux/delay.h>

static struct hrtimer kthread_timer;

#define DISP_BUF_LEN    2
#define DISP_DIG_LEN    4

typedef struct _disp_buf_t{
   
   
    uint8_t     output[DISP_BUF_LEN];
    uint8_t     dig[DISP_DIG_LEN]
}disp_buf_t;

disp_buf_t disp_buf;;

#define SERIAL_CLK_PIN	NUC980_PB0
#define SERIAL_PE_PIN	NUC980_PB3
#define SERIAL_LE_PIN	NUC980_PB2
#define SERIAL_IN_PIN	NUC980_PB6
#define SERIAL_OUT_PIN	NUC980_PB4

#define serial_clk_pin(sta)         gpio_set_value(SERIAL_CLK_PIN, sta)
#define serial_pe_pin(sta)          gpio_set_value(SERIAL_PE_PIN, sta)
#define serial_le_pin(sta)          gpio_set_value(SERIAL_LE_PIN, sta)
#define serial_in_pin()             gpio_get_value(SERIAL_IN_PIN)
#define serial_out_pin(sta)         gpio_set_value(SERIAL_OUT_PIN, sta)

#define LED_PIN		NUC980_PB13

#define EXTIO_IN_MAX	24
#define EXTIO_OUT_MAX	8
#define EXTIO_KEY_MAX	2
#define EXTIO_CHECK_AMX	2

#define EXTIO_SET_KEY	0
#define EXTIO_OPEN_KEY	1

#define EXTIO_KEY_RELEASE	0
#define EXTIO_KEY_PRESS		1
#define EXTIO_KEY_KEEP		2

#define EXTIO_CHECK_POWERDOWN	0
#define EXTIO_CHECK_EMERGENCY	1

typedef struct _input_t{
   
   
	uint8_t		buf[EXTIO_IN_MAX/8];
	uint8_t		save[EXTIO_IN_MAX/8];
	uint8_t		timer[EXTIO_IN_MAX];
}input_t;

typedef struct _output_t{
   
   
	uint8_t		byte[EXTIO_OUT_MAX/8];
}output_t;

typedef struct _check_t{
   
   
	uint8_t		sta[EXTIO_CHECK_AMX];
	uint8_t		time[EXTIO_CHECK_AMX];
}check_t;

typedef struct _extio_t{
   
   
	input_t		input;
	output_t	output;
	key_t		key;
	check_t		check;
}extio_t;

extio_t	extio;

void extio_write(uint8_t byte)
{
   
   
    uint8_t i;
	for( i=0; i<8; i++ ){
   
   
		
		if( byte&(0x80) )
			serial_out_pin(1);
		else
			serial_out_pin(0);
		
		serial_clk_pin(1);
		udelay(100);
		serial_clk_pin(0);
		udelay(100);
		byte<<=1;
	}
}

void extio_output(void)
{
   
   
    uint8_t i;
	for( i=
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵向深耕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值