当前位置:网站首页>i. Mx6ull driver development | 24 - platform based driver model lights LED
i. Mx6ull driver development | 24 - platform based driver model lights LED
2022-07-04 22:04:00 【Mculover666】
One 、 Write basic device driver module
Write driver module source code :
#include <linux/module.h>
#include <linux/init.h>
static int __init platform_led_init(void)
{
return 0;
}
static void __exit platform_led_exit(void)
{
}
module_init(platform_led_init);
module_exit(platform_led_exit);
MODULE_AUTHOR("Mculover666");
MODULE_LICENSE("GPL");
To write Makefile:
KERNEL_DIR = /home/mculover666/develop/imx6ull/linux-imx6ull
obj-m := platform_led.o
build: kernel_module
kernel_module:
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean
compile :
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make
Two 、 To write platform Drive frame
add to platform Drive frame :
#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>
static int led_probe(struct platform_device *dev)
{
return 0;
}
static int led_remove(struct platform_device *dev)
{
return 0;
}
/** * @brief Device tree matching list */
static const struct of_device_id plat_led_of_match[] = {
{
.compatible = "atk,plat_led" },
{
},
};
/** * @brief Tradition id Method matching list */
static const struct platform_device_id plat_led_id[] = {
{
"atk,plat_led", 0 },
{
},
};
static struct platform_driver led_driver = {
.probe = led_probe,
.remove = led_remove,
.driver = {
.name = "platform_led",
.owner = THIS_MODULE,
.of_match_table = plat_led_of_match,
},
.id_table = plat_led_id,
};
static int __init platform_led_init(void)
{
int ret;
ret = platform_driver_register(&led_driver);
if (ret < 0) {
printk("platform_driver_register fail!\n");
return -1;
}
return 0;
}
static void __exit platform_led_exit(void)
{
platform_driver_unregister(&led_driver);
}
module_init(platform_led_init);
module_exit(platform_led_exit);
MODULE_AUTHOR("Mculover666");
MODULE_LICENSE("GPL");
3、 ... and 、 Write character device driver
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
dev_t led_dts_dev;
struct cdev *led_dts_cdev;
struct class *led_dts_class;
struct device *led_dts_device0;
static int led_dts_open(struct inode *inode, struct file *fp)
{
return 0;
}
static int led_dts_read(struct file *fp, char __user *buf, size_t size, loff_t *off)
{
return 0;
}
static int led_dts_write(struct file *fp, const char __user *buf, size_t size, loff_t *off)
{
return 0;
}
static int led_dts_release(struct inode *inode, struct file *fp)
{
return 0;
}
static struct file_operations led_dts_fops = {
.owner = THIS_MODULE,
.open = led_dts_open,
.read = led_dts_read,
.write = led_dts_write,
.release = led_dts_release,
};
static int led_probe(struct platform_device *dev)
{
int ret;
printk("led probe called!\n");
// Distribute cdev Device number
ret = alloc_chrdev_region(&led_dts_dev, 0, 1, "led_dts");
if (ret != 0) {
printk("alloc_chrdev_region fail!");
return -1;
}
// initialization cdev
led_dts_cdev = cdev_alloc();
if (!led_dts_cdev) {
printk("cdev_alloc fail!");
return -1;
}
// Set up fop Operation function
led_dts_cdev->owner = THIS_MODULE;
led_dts_cdev->ops = &led_dts_fops;
// register cdev
cdev_add(led_dts_cdev, led_dts_dev, 1);
// Create device classes
led_dts_class = class_create(THIS_MODULE, "led_dts_class");
if (!led_dts_class) {
printk("class_create fail!");
return -1;
}
// Create device nodes
led_dts_device0 = device_create(led_dts_class, NULL, led_dts_dev, NULL, "led0");
if (IS_ERR(led_dts_device0)) {
printk("device_create led_dts_device0 fail!");
return -1;
}
return 0;
}
static int led_remove(struct platform_device *dev)
{
printk("led remove called!\n");
// Remove the device from the kernel
cdev_del(led_dts_cdev);
// Release the device number
unregister_chrdev_region(led_dts_dev, 1);
// Delete device node
device_destroy(led_dts_class, led_dts_dev);
// Delete device class
class_destroy(led_dts_class);
return 0;
}
Four 、 To write LED drive
and i.MX6ULL Drive development | 08 - be based on pinctrl Subsystem and gpio Subsystem on LED equally .
5、 ... and 、 test result
1. Load driver module
see platform Whether the bus is registered :
ls /sys/bus/platform/drivers
Check whether the bus device is registered ( Because there is a description of the device tree node ):
ls /sys/bus/platform/devices/
Be careful , When the driver loads , The kernel will match the corresponding device , Therefore, the compatibility described in the device tree node should be consistent with that in the driver :
2. led test
View device nodes :
ls /dev/
Run the test program , You can see led flashing :
边栏推荐
- 网上开户哪家证券公司佣金最低,我要开户,网上开户安全吗
- GTEST from ignorance to proficient use (2) what is test fixture
- HDU - 2859 Phalanx(DP)
- Application practice | Shuhai supply chain construction of data center based on Apache Doris
- Hash table
- From repvgg to mobileone, including mobileone code
- gtest从一无所知到熟练使用(4)如何用gtest写单元测试
- El tree combined with El table, tree adding and modifying operations
- 股票开户流程是什么?使用同花顺手机炒股软件安全吗?
- Shutter WebView example
猜你喜欢
GTEST from ignorance to proficiency (3) what are test suite and test case
赋能数字经济 福昕软件出席金砖国家可持续发展高层论坛
Redis 排查大 key 的3种方法,优化必备
El tree combined with El table, tree adding and modifying operations
TCP shakes hands three times and waves four times. Do you really understand?
CloudCompare&Open3D DBSCAN聚类(非插件式)
超详细教程,一文入门Istio架构原理及实战应用
历史最全混合专家(MOE)模型相关精选论文、系统、应用整理分享
Flutter TextField示例
Keep on fighting! The city chain technology digital summit was grandly held in Chongqing
随机推荐
赋能数字经济 福昕软件出席金砖国家可持续发展高层论坛
New intersectionobserver usage notes
el-tree结合el-table,树形添加修改操作
并发网络模块化 读书笔记转
广电五舟与华为签署合作协议,共同推进昇腾AI产业持续发展
Drop down selection of Ehlib database records
Operation of adding material schedule in SolidWorks drawing
服装企业为什么要谈信息化?
【公开课预告】:视频质量评价基础与实践
Acwing 2022 daily question
bizchart+slider实现分组柱状图
如何使用ConcurrentLinkedQueue做一个缓存队列
Solve the problem of data disorder caused by slow asynchronous interface
HDU - 2859 Phalanx(DP)
一文掌握数仓中auto analyze的使用
[advanced C language] array & pointer & array written test questions
GTEST from ignorance to proficiency (3) what are test suite and test case
El tree combined with El table, tree adding and modifying operations
能源势动:电力行业的碳中和该如何实现?
283. Moving zero-c and language assisted array method