当前位置:网站首页>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 :
边栏推荐
- Hash table
- Monitor the shuttle return button
- 股票开户流程是什么?使用同花顺手机炒股软件安全吗?
- [weekly translation go] how to code in go series articles are online!!
- 一文掌握数仓中auto analyze的使用
- WebGIS framework -- kalrry
- Lambdaquerywrapper usage
- How to implement Devops with automatic tools
- Keep on fighting! The city chain technology digital summit was grandly held in Chongqing
- Flink1.13 SQL basic syntax (I) DDL, DML
猜你喜欢

DevEco Device Tool 3.0 Release带来5大能力升级,让智能设备开发更高效

TCP shakes hands three times and waves four times. Do you really understand?

Bizchart+slider to realize grouping histogram

做BI开发,为什么一定要熟悉行业和企业业务?

GTEST from ignorance to proficiency (3) what are test suite and test case

什么是商业智能(BI),就看这篇文章足够了

一文掌握数仓中auto analyze的使用

NAACL-22 | 在基于Prompt的文本生成任务上引入迁移学习的设置

Operation of adding material schedule in SolidWorks drawing

How was MP3 born?
随机推荐
Drop down selection of Ehlib database records
From repvgg to mobileone, including mobileone code
[advanced C language] array & pointer & array written test questions
使用 BlocConsumer 同时构建响应式组件和监听状态
Cadeus has never stopped innovating. Decentralized edge rendering technology makes the metauniverse no longer far away
TCP protocol three times handshake process
gtest从一无所知到熟练使用(3)什么是test suite和test case
Rotary transformer string judgment
Sorting and sharing of selected papers, systems and applications related to the most comprehensive mixed expert (MOE) model in history
解决异步接口慢导致的数据错乱问题
应用实践 | 蜀海供应链基于 Apache Doris 的数据中台建设
Delphi soap WebService server-side multiple soapdatamodules implement the same interface method, interface inheritance
What is the stock account opening process? Is it safe to use flush mobile stock trading software?
服装企业为什么要谈信息化?
面试题 01.01. 判定字符是否唯一
删库不必跑路!详解 MySQL 数据恢复
VIM from dislike to dependence (23) -- the last gossip
# 2156. 查找给定哈希值的子串-后序遍历
迷失在Mysql的锁世界
CloudCompare&Open3D DBSCAN聚类(非插件式)