Ai
1 Star 0 Fork 0

苏木/imx6ull-driver-demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
sdevice_demo.c 4.44 KB
一键复制 编辑 原始数据 按行查看 历史
苏木 提交于 2025-01-12 11:22 +08:00 . 添加部分注释信息
#include <linux/init.h> /* module_init module_exit */
#include <linux/kernel.h>
#include <linux/module.h> /* MODULE_LICENSE */
#include <linux/device.h>
#include "./timestamp_autogenerated.h"
#include "./version_autogenerated.h"
#include "./sdrv_common.h"
// #undef PRT
// #undef PRTE
#ifndef PRT
#define PRT printk
#endif
#ifndef PRTE
#define PRTE printk
#endif
#define SDEV_NAME "sdev" // 和驱动中的匹配名称相同时就可以匹配对应的驱动, 会在 /sys/bus/bus-name/devices 中显示
extern struct bus_type sbus; // sbus 操作函数集的那个全局变量,包含了match函数
typedef struct __SDEV_ATTR_VAR_{
char name_attr[32];
int data;
}sdev_attr_var_t;
sdev_attr_var_t sdev_attr = {0}; // sdevice 的属性
/**
* @brief sdev_release()
* @note
* @param [in]
* @param [out]
* @retval
*/
void sdev_release(struct device *dev)
{
int len = 0;
const char *device_name = dev_name(dev);
len = strlen(device_name);
PRT("dev name is %s, len = %d\n", device_name, len);
}
static struct device sdev = {
.init_name = SDEV_NAME, // 设备的初始化名称,会在 /sys/bus/bus-name/devices 中显示
.bus = &sbus, // 所属总线
.release = sdev_release, // 设备的释放回调函数
};
/**
* @brief sdev_show()
* @note 提供show回调函数,这样用户便可以通过cat命令, 来查询相关属性参数
* @param [in]
* @param [out]
* @retval
*/
static ssize_t sdev_attr_data_show(struct device *dev, struct device_attribute *attr, char *buf)
{
ssize_t count = 0;
count = sprintf(buf, "%d\n", sdev_attr.data);
PRT("attr->name=%s count=%d\n", attr->attr.name, count);
return count;
}
/**
* @brief sdev_store()
* @note 提供store回调函数,这样用户便可以通过echo命令, 来修改相关属性参数
* @param [in]
* @param [out]
* @retval
*/
static ssize_t sdev_attr_data_store(struct device * dev, struct device_attribute * attr, const char *buf, size_t count)
{
PRT("attr->name=%s count=%d\n", attr->attr.name, count);
sscanf(buf, "%d\n", &sdev_attr.data);
return count;
}
// 下面这个宏可以简化属性变量的定义,从定义可以看出,这里定义的属性的变量前缀是 dev_attr_,后面要再拼接name才行
// #define DEVICE_ATTR(_name, _mode, _show, _store)
// struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
struct device_attribute sdev_attr_data_var = {
.attr = {
.name = "sdev_attr_data", // 属性的名称,将会显示在 /sys/bus/bus-name/devices/device-name/ 中,并可以使用cat/echo 进行操作
.mode = 0664, // 属性的访问权限
},
.show = sdev_attr_data_show, // 属性的 show 回调函数
.store = sdev_attr_data_store, // 属性的 show 回调函数
};
/**
* @brief sdev_demo_init()
* @note 设备结构体以及属性文件结构体注册
* @param [in]
* @param [out]
* @retval
*/
static __init int sdev_demo_init(void)
{
int ret = 0;
printk("*** [%s:%d]Build Time: %s %s, git version:%s ***\n", __FUNCTION__,
__LINE__, KERNEL_KO_DATE, KERNEL_KO_TIME, KERNEL_KO_VERSION);
PRT("sdev_demo module init!\n");
ret = device_register(&sdev);
if(ret < 0)
{
PRTE("device_register fail! ret = %d\n", ret);
goto err_device_register;
}
ret = device_create_file(&sdev, &sdev_attr_data_var);
if(ret < 0)
{
PRTE("device_create_file fail!\n");
goto err_device_create_file;
}
return 0;
err_device_create_file:
device_unregister(&sdev);
err_device_register:
return ret;
}
/**
* @brief sdev_demo_exit
* @note 设备结构体以及属性文件结构体注销。
* @param [in]
* @param [out]
* @retval
*/
static __exit void sdev_demo_exit(void)
{
device_remove_file(&sdev, &sdev_attr_data_var);
device_unregister(&sdev); // 取消注册设备
PRT("sdev_demo module exit!\n");
}
module_init(sdev_demo_init); // 将__init定义的函数指定为驱动的入口函数
module_exit(sdev_demo_exit); // 将__exit定义的函数指定为驱动的出口函数
/* 模块信息(通过 modinfo chrdev_led_demo 查看) */
MODULE_LICENSE("GPL v2"); /* 源码的许可证协议 */
MODULE_AUTHOR("sumu"); /* 字符串常量内容为模块作者说明 */
MODULE_DESCRIPTION("Description"); /* 字符串常量内容为模块功能说明 */
MODULE_ALIAS("module's other name"); /* 字符串常量内容为模块别名 */
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/sumumm/imx6ull-driver-demo.git
git@gitee.com:sumumm/imx6ull-driver-demo.git
sumumm
imx6ull-driver-demo
imx6ull-driver-demo
master

搜索帮助