【Linux】【驱动】设备树下的paltform总线

1. 驱动程序的完整代码

主要是展示了通过总线上挂载的方式来实现相关的数据读取
实质上就是几个of函数的调用。

/*
 * @Author: topeet
 * @Description: 设备树下的平台总线驱动,匹配成功后,去设备树文件中获取硬件信息,然后物理地址映射为虚拟地址,接下来可以注册字符设备和杂项设备
 
 */
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_address.h>

int size;
int ret = 0;
u32 out_values[2] = {0};
const char *str;

struct device_node *test_device_node;
struct property *test_node_property;
unsigned int *vir_gpio_dr;
int beep_probe(struct platform_device *pdev)
{ //匹配成功以后,进入到probe函数
	printk("beep_probe\n");
	/*********************方法一:直接获取节点**************************/
	//printk("node name is %s\n",pdev->dev.of_node->name);
	/*********************方法二:通过函数获取硬件资源**************************/
	/* test_device_node = of_find_node_by_path("/test");  //获得设备节点
	if(test_device_node == NULL){
	printk("of_find_node_by_path is error \n");
	return -1;
	}*/
	//将此段代码注释掉
	ret = of_property_read_u32_array(pdev->dev.of_node, "reg", out_values, 2);
	if (ret < 0)
	{
		printk("of_property_read_u32_array is error \n");
		return -1;
	}
	printk("out_values[0] is 0x%08x\n", out_values[0]);
	printk("out_values[1] is 0x%08x\n", out_values[1]);
	/*********************映射物理地址**************************/
	vir_gpio_dr = of_iomap(pdev->dev.of_node, 0);
	if (vir_gpio_dr == NULL)
	{
		printk("of_iomap is error \n");
		return -1;
	}
	printk("of_iomap is ok \n");
	return 0;
}
int beep_remove(struct platform_device *pdev)
{
	printk("beep_remove\n");
	return 0;
}
const struct platform_device_id beep_idtable = {
	.name = "beep_test",
};
const struct of_device_id of_match_table_test[] = {
	{.compatible = "test1234"},
	{},
};
struct platform_driver beep_driver = {
	//3. 在beep_driver结构体中完成了beep_probe和beep_remove
	.probe = beep_probe,
	.remove = beep_remove,
	.driver = {
		.owner = THIS_MODULE,
		.name = "beep_test",
		.of_match_table = of_match_table_test //接下来我们改一下驱动,让他来匹配设备树里面test的节点
	},
	.id_table = &beep_idtable //4 .id_table的优先级要比driver.name的优先级要高,优先与.id_table进行匹配
};

static int beep_driver_init(void)
{
	// 1.我们看驱动文件要从init函数开始看
	int ret = 0;
	//2. 在init函数里面注册了platform_driver
	ret = platform_driver_register(&beep_driver);
	if (ret < 0)
	{
		printk("platform_driver_register error \n");
	}
	printk("platform_driver_register ok \n");

	return 0;
}

static void beep_driver_exit(void)
{
	platform_driver_unregister(&beep_driver);
	printk("gooodbye! \n");
}
module_init(beep_driver_init);
module_exit(beep_driver_exit);

MODULE_LICENSE("GPL");

2. 使用到的相关函数

vir_gpio_dr = of_iomap(pdev->dev.of_node, 0);
ret = of_property_read_u32_array(pdev->dev.of_node, "reg", out_values, 2);
test_device_node = of_find_node_by_path("/test");  //获得设备节点

3 使用到的指令

3.1 主机上使用的指令

cp driver.ko ~/nfs_rootfs/

3.2 设备上使用的指令

打开Printk

echo "7 4 1 7"> /proc/sys/kernel/printk

挂载nfs设备

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

查看设备树信息

cd /proc/device-tree

挂载设备

insmod driver.ko

移除设备

 rmmod driver.ko
### VMware与Windows Hypervisor Platform的兼容性分析 VMware支持多种虚拟化环境,包括KVM和VMware本身,并通过libvirt提供管理接口[^1]。然而,在讨论VMware与Windows Hypervisor Platform (WHP) 的兼容性和配置时,需要注意两者的设计目标和技术架构存在差异。 #### 技术背景 Windows Hypervisor Platform 是微软开发的一个轻量级虚拟化框架,主要用于容器隔离和其他特定场景下的虚拟化需求。而VMware是一个功能全面的企业级虚拟化平台,提供了更复杂的管理和性能优化工具。两者的底层实现机制不同,因此在某些情况下可能存在冲突或不完全兼容的情况。 #### 配置注意事项 当尝试在同一主机上运行VMware产品(如Workstation、ESXi或其他组件)以及启用Windows Hypervisor Platform时,需注意以下几点: 1. **硬件辅助虚拟化资源的竞争** Windows Hypervisor Platform 和 VMware 可能会争夺相同的硬件辅助虚拟化资源(如Intel VT-x 或 AMD-V)。如果操作系统已经启用了 WHP,则可能会影响 VMware 虚拟机的正常启动或性能表现[^3]。 2. **模块参数调整** 对于Linux内核中的可加载模块,可以使用`modinfo -p ${modulename}`命令查看当前可用的参数列表,并通过修改 `/sys/module/${modulename}/parameters/` 下的相关文件来动态调整这些参数。这一步骤对于解决潜在的驱动程序冲突尤为重要。 3. **应急处理设置** 如果遇到严重的系统崩溃情况,可以通过指定 `vmpanic=` 参数执行z/VM CP指令作为调试手段之一[^2]。尽管此选项主要针对IBM Z系列架构上的特殊用途,但它体现了如何利用低级别的控制机制应对极端状况的理念。 #### 推荐实践 为了确保最佳体验并减少不必要的干扰,请考虑以下建议: - 确认宿主操作系统的版本和支持状态; - 测试不同的组合方式以找到最稳定的方案; - 安装最新的补丁更新保持软件栈处于良好维护之中。 ```bash # 示例:查询某个模块的所有参数 modinfo -p kvm_intel ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值