platform.c
/* 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
###########
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
#!/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
#!/bin/sh
echo "rmmod platform_drv"
rmmod platform_drv
x86上driver+device机制启动,dmesg log输出
[ 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
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部分
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输出
[ 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 删除。