⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firmware_sample_driver.c

📁 linux 内核源代码
💻 C
字号:
/* * firmware_sample_driver.c - * * Copyright (c) 2003 Manuel Estrada Sainz * * Sample code on how to use request_firmware() from drivers. * */#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/device.h>#include <linux/string.h>#include "linux/firmware.h"static struct device ghost_device = {	.bus_id    = "ghost0",};static void sample_firmware_load(char *firmware, int size){	u8 buf[size+1];	memcpy(buf, firmware, size);	buf[size] = '\0';	printk(KERN_INFO "firmware_sample_driver: firmware: %s\n", buf);}static void sample_probe_default(void){	/* uses the default method to get the firmware */        const struct firmware *fw_entry;	printk(KERN_INFO "firmware_sample_driver: a ghost device got inserted :)\n");        if(request_firmware(&fw_entry, "sample_driver_fw", &ghost_device)!=0)	{		printk(KERN_ERR		       "firmware_sample_driver: Firmware not available\n");		return;	}		sample_firmware_load(fw_entry->data, fw_entry->size);	release_firmware(fw_entry);	/* finish setting up the device */}static void sample_probe_specific(void){	/* Uses some specific hotplug support to get the firmware from	 * userspace  directly into the hardware, or via some sysfs file */	/* NOTE: This currently doesn't work */	printk(KERN_INFO "firmware_sample_driver: a ghost device got inserted :)\n");        if(request_firmware(NULL, "sample_driver_fw", &ghost_device)!=0)	{		printk(KERN_ERR		       "firmware_sample_driver: Firmware load failed\n");		return;	}		/* request_firmware blocks until userspace finished, so at	 * this point the firmware should be already in the device */	/* finish setting up the device */}static void sample_probe_async_cont(const struct firmware *fw, void *context){	if(!fw){		printk(KERN_ERR		       "firmware_sample_driver: firmware load failed\n");		return;	}	printk(KERN_INFO "firmware_sample_driver: device pointer \"%s\"\n",	       (char *)context);	sample_firmware_load(fw->data, fw->size);}static void sample_probe_async(void){	/* Let's say that I can't sleep */	int error;	error = request_firmware_nowait (THIS_MODULE, FW_ACTION_NOHOTPLUG,					 "sample_driver_fw", &ghost_device,					 "my device pointer",					 sample_probe_async_cont);	if(error){		printk(KERN_ERR 		       "firmware_sample_driver:"		       " request_firmware_nowait failed\n");	}}static int sample_init(void){	device_initialize(&ghost_device);	/* since there is no real hardware insertion I just call the	 * sample probe functions here */	sample_probe_specific();	sample_probe_default();	sample_probe_async();	return 0;}static void __exit sample_exit(void){}module_init (sample_init);module_exit (sample_exit);MODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -