初始化驱动层的数码管设备树与设置参数,实现用应用层实现控制
驱动文件:
#include <linux/init.h>
#include <linux/module.h>
#include<linux/spi/spi.h>
int major,minor;
struct class *cls;//句柄
struct device *dev;
struct spi_device *spi;
char buf[2]={};
int mycdev_open(struct inode *inode, struct file *file)
{
return 0;
}
//read()
ssize_t mycdev_read(struct file *file, char __user *ubuf, size_t size, loff_t *loff)
{
return size;
}
//write()
ssize_t mycdev_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loff)
{
copy_from_user(buf,ubuf,sizeof(buf));
spi_write(spi,buf,sizeof(buf));
return 0;
}
//close()
int mycdev_close(struct inode *inode, struct file *file)
{
return 0;
}
struct file_operations fops=
{
.open=mycdev_open,
.read=mycdev_read,
.write=mycdev_write,
.release=mycdev_close,
};
int m74hc595_probe(struct spi_device *my_spi)
{
spi = my_spi;
//注册字符设备
major = register_chrdev(0, "m74hc595", &fops);
if (major < 0)
{
printk("注册字符设备驱动失败\n");
return major;
}
printk("注册字符设备驱动成功\n");
//自动创建设备节点
//向上提交目录
cls = class_create(THIS_MODULE, "m74hc595");
if (IS_ERR(cls))
{
printk("向上提交目录失败\n");
return PTR_ERR(cls);
}
printk("向上提交目录成功\n");
//向上提交节点信息
dev = device_create(cls, NULL, MKDEV(major, 0), NULL, "m74hc595");
if (IS_ERR(dev))
{
printk("向上提交节点信息失败\n");
return PTR_ERR(dev);
}
printk("向上提交节点成功\n");
return 0;
}
int m74hc595_remove(struct spi_device *spi)
{
//1.销毁设备节点
device_destroy(cls,MKDEV(major,0));
class_destroy(cls);
//2.注销字符设备驱动
unregister_chrdev(major,"m74hc595");
return 0;
}
//设备树匹配表
struct of_device_id of_table[]={
{.compatible = "hqyj,m74hc595",},
{},
};
MODULE_DEVICE_TABLE(of,of_table);
//定义SPI对象并且初始化
struct spi_driver m74hc595 ={
.probe=m74hc595_probe,
.remove=m74hc595_remove,
.driver={
.name="m74hc595",
.of_match_table=of_table,
},
};
module_spi_driver(m74hc595);
MODULE_LICENSE("GPL");
应用层:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,const char * argv[])
{
int i,j;
char buf[2];
char arr1[4]={0x1,0x2,0x4,0x8};
char arr2[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7f, 0x6F};
int fd = open("/dev/m74hc595", O_RDWR);
if (fd < 0)
{
printf("打开设备文件失败\n");
exit(-1);
}
printf("打开设备文件成功\n");
//从终端读取
while (1)
{
for(i=0;i<4;i++)
{
for(j=0;j<10;j++){
buf[0]=arr1[i];
buf[1]=arr2[j];
write(fd, buf, sizeof(buf));
sleep(1);
}
}
}
close(fd);
return 0;
}