首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >platform架构驱动简单示例+dts-compatible打印输出

platform架构驱动简单示例+dts-compatible打印输出

原创
作者头像
tankaro
发布2025-01-20 11:18:15
发布2025-01-20 11:18:15
1540
举报
文章被收录于专栏:Linux kernelLinux kernel

platform.c

代码语言:txt
复制
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * Copyright (C) 2024-2025 Jim Gao <gaozhsoft@aliyun.com>
 *
 */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/platform_device.h>


static int platform_drv_probe(struct platform_device *pdev)
{
	struct device		*dev = &pdev->dev;

    printk(KERN_INFO "[%s +%d] start\n", __func__, __LINE__);
    printk(KERN_INFO "[%s +%d] dev->init_name=%s\n", __func__, __LINE__, dev->init_name);
    printk(KERN_INFO "[%s +%d] dev->driver->name=%s\n", __func__, __LINE__, dev->driver->name);

    printk(KERN_INFO "[%s +%d] end\n", __func__, __LINE__);

    return 0;
}
static int platform_drv_remove(struct platform_device *pdev)
{
    printk(KERN_INFO "[%s +%d] start\n", __func__, __LINE__);
    printk(KERN_INFO "[%s +%d] end\n", __func__, __LINE__);

    return 0;
}

static struct platform_driver platform_pdrv = {
    .probe		= platform_drv_probe,
    .remove		= platform_drv_remove,
    .driver		= {
        .name	= "platform_name",
    },
};

static void platform_pdev_release(struct device *dev)
{
    printk(KERN_INFO "[%s +%d] start\n", __func__, __LINE__);
    printk(KERN_INFO "[%s +%d] end\n", __func__, __LINE__);
}

static struct platform_device platform_pdev = {
    .name			= "platform_name",
    .dev.release	= platform_pdev_release,
};

static int __init platform_drv_init(void)
{
    int ret;
    printk(KERN_INFO "[%s +%d] start\n", __func__, __LINE__);
    ret = platform_device_register(&platform_pdev);
    if (ret)
        return ret;
    ret = platform_driver_register(&platform_pdrv);
    if (ret)
        platform_device_unregister(&platform_pdev);
    printk(KERN_INFO "[%s +%d] end\n", __func__, __LINE__);
	
	return ret;
}

static void __exit platform_drv_exit(void)
{
	printk(KERN_INFO "[%s +%d] start\n", __func__, __LINE__);
    platform_driver_unregister(&platform_pdrv);
    platform_device_unregister(&platform_pdev);
    printk(KERN_INFO "[%s +%d] end\n", __func__, __LINE__);
}

module_init(platform_drv_init);
module_exit(platform_drv_exit);

MODULE_AUTHOR("Jim Gao <gaozhsoft@aliyun.com>");
MODULE_DESCRIPTION("basic example for platform driver");
MODULE_LICENSE("GPL v2");

Makefile

代码语言:txt
复制
###########
USE_MAKEFILE_DATE_TIME = y
ifeq ($(strip $(USE_MAKEFILE_DATE_TIME)),y)
EXTRA_CFLAGS += -Wno-error=date-time
EXTRA_CFLAGS += -Wno-date-time
EXTRA_CFLAGS += -DENABLE_MAKEFILE_DATE_TIME
endif

EXTRA_CFLAGS += -g

KERNEL_DIR = /lib/modules/`uname -r`/build

MODULE_NAME = platform_drv
obj-m := $(MODULE_NAME).o 

modules:
	$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

clean distclean:
	rm -f *.o *.mod.c .*.*.cmd *.ko .*.o.d *.mod
	rm -rf .tmp_versions modules.order Module.symvers

insmod.sh

代码语言:txt
复制
#!/bin/sh
if [ ! -d /lib/modules/`uname -r`/extra ]; then
	sudo mkdir /lib/modules/`uname -r`/extra
else
    echo "/lib/modules/`uname -r`/extra File exists"
fi

echo "cp platform_drv.ko /lib/modules/`uname -r`/extra"
sudo cp platform_drv.ko /lib/modules/`uname -r`/extra

sudo depmod

echo "modprobe platform_drv"
sudo modprobe platform_drv
# disable autoload
vdrm_drvblack=$(grep -w platform_drv /etc/modprobe.d/blacklist.conf)

if [ x"$vdrm_drvblack" = x"" ]
then
    echo ' ' | sudo -S cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.bak
    echo "# Don't load platform_drv drv kernel module on boot" | sudo -S tee -a /etc/modprobe.d/blacklist.conf
    echo "blacklist platform_drv" | sudo -S tee -a /etc/modprobe.d/blacklist.conf
    echo ' ' | sudo -S depmod
    echo ' ' | sudo -S ldconfig /usr/local/lib /usr/local/lib32
else
    echo "platform_drv is already in blacklist"
fi

if [ ! -d /lib/modules/`uname -r`/extra ]; then
	sudo mkdir /lib/modules/`uname -r`/extra
else
    echo "/lib/modules/`uname -r`/extra File exists"
fi

rmmod.sh

代码语言:txt
复制
#!/bin/sh

echo "rmmod platform_drv"
rmmod platform_drv

x86上driver+device机制启动,dmesg log输出

代码语言:txt
复制
[ 2136.298820] [platform_drv_init +61] start
[ 2136.320064] [platform_drv_probe +23] start
[ 2136.320073] [platform_drv_probe +24] dev->init_name=(null)
[ 2136.320076] [platform_drv_probe +25] dev->driver->name=platform_name
[ 2136.320079] [platform_drv_probe +27] end
[ 2136.320191] [platform_drv_init +68] end
[ 2138.880443] [platform_drv_exit +75] start
[ 2138.880495] [platform_drv_remove +33] start
[ 2138.880498] [platform_drv_remove +34] end
[ 2138.880689] [platform_pdev_release +49] start
[ 2138.880693] [platform_pdev_release +50] end
[ 2138.880698] [platform_drv_exit +78] end

arm64上driver+dts机制启动,C代码,drivers/usb/dwc3/core.c

代码语言:txt
复制
static int dwc3_probe(struct platform_device *pdev)
{
	struct device		*dev = &pdev->dev;
	struct resource		*res, dwc_res;
	struct dwc3_vendor	*vdwc;
	struct dwc3		*dwc;

	int			ret;

	void __iomem		*regs;
	printk("[%s +%d %s] \n", __FILE__, __LINE__, __func__);
	printk("[%s +%d %s] pdev->name=%s\n", __FILE__, __LINE__, __func__, pdev->name);
	printk("[%s +%d %s] dev->driver->name=%s\n", __FILE__, __LINE__, __func__, dev->driver->name);
	printk("[%s +%d %s] dev->driver->of_match_table->name=%s\n", __FILE__, __LINE__, __func__, dev->driver->of_match_table->name);
	printk("[%s +%d %s] dev->driver->of_match_table->compatible=%s\n", __FILE__, __LINE__, __func__, dev->driver->of_match_table->compatible);

arm64上driver+dts机制启动,dts部分

代码语言:txt
复制
	usbdrd3_0 {
		compatible = "rockchip,rk3588-dwc3\0rockchip,rk3399-dwc3";
		clocks = <0x02 0x1a3 0x02 0x1a2 0x02 0x1a1>;
		clock-names = "ref\0suspend\0bus";
		#address-cells = <0x02>;
		#size-cells = <0x02>;
		ranges;
		status = "okay";
		phandle = <0x255>;

		usb@fc000000 {
			compatible = "snps,dwc3";
			reg = <0x00 0xfc000000 0x00 0x400000>;
			interrupts = <0x00 0xdc 0x04>;
			power-domains = <0x61 0x1f>;
			resets = <0x02 0x2a4>;
			reset-names = "usb3-otg";
			dr_mode = "otg";
			phys = <0x67 0x68>;
			phy-names = "usb2-phy\0usb3-phy";

arm64上driver+dts机制启动,

dmesg log输出

代码语言:txt
复制
[    4.388321] [drivers/usb/dwc3/core.c +1582 dwc3_probe]
[    4.388325] [drivers/usb/dwc3/core.c +1583 dwc3_probe] pdev->name=fc000000.usb
[    4.388327] [drivers/usb/dwc3/core.c +1584 dwc3_probe] dev->driver->name=dwc3
[    4.388330] [drivers/usb/dwc3/core.c +1585 dwc3_probe] dev->driver->of_match_table->name=
[    4.388333] [drivers/usb/dwc3/core.c +1586 dwc3_probe] dev->driver->of_match_table->compatible=snps,dwc3
[    4.388336] [drivers/usb/dwc3/core.c +1611 dwc3_probe] dwc->xhci_resources[0].start=0x4227858432
[    4.388340] [drivers/usb/dwc3/core.c +1612 dwc3_probe] dwc->xhci_resources[0].end=0x4227891199
[    4.388342] [drivers/usb/dwc3/core.c +1613 dwc3_probe] dwc->xhci_resources[0].name=usb@fc000000

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档