bus, device 및 driver

6864 단어
사실 이 세 부분은 매우 넓게 관련되어 있지만, 여기에는 간단하게 모형만 이야기할 뿐이다.
우선 버스 프로그램 부분을 살펴보겠습니다.



/*             */
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>

MODULE_AUTHOR("David Xie");
MODULE_LICENSE("Dual BSD/GPL");

static char *Version = "$Revision: 1.9 $";

/*
	  bus_id name    ,              。
*/
static int my_match(struct device *dev, struct device_driver *driver)
{
	return !strncmp(dev->bus_id, driver->name, strlen(driver->name));
}

static void my_bus_release(struct device *dev)
{
	printk(KERN_DEBUG "my bus release
"); } struct device my_bus = { .bus_id = "my_bus0", .release = my_bus_release }; struct bus_type my_bus_type = { .name = "my_bus", .match = my_match, }; EXPORT_SYMBOL(my_bus); EXPORT_SYMBOL(my_bus_type); /* * Export a simple attribute. */ static ssize_t show_bus_version(struct bus_type *bus, char *buf) { return snprintf(buf, PAGE_SIZE, "%s
", Version); } static BUS_ATTR(version, S_IRUGO, show_bus_version, NULL); static int __init my_bus_init(void) { int ret; /* */ ret = bus_register(&my_bus_type); if (ret) return ret; /* */ if (bus_create_file(&my_bus_type, &bus_attr_version)) printk(KERN_NOTICE "Fail to create version attribute!
"); /* 。 */ ret = device_register(&my_bus); if (ret) printk(KERN_NOTICE "Fail to register device:my_bus!
"); return ret; } static void my_bus_exit(void) { device_unregister(&my_bus); bus_unregister(&my_bus_type); } module_init(my_bus_init); module_exit(my_bus_exit);

이 버스 등록 프로그램에서 가장 먼저 주의해야 할 것은/* 버스 등록 */ret =busregister(&my_bus_type);동시에 이 구조체 my 주의bus_type, 이 구조체는 버스를 묘사하는 데 쓰인다.또 다른 함수가 있습니다:ret = deviceregister(&my_bus);이 구조체 mybus는 이 버스 설비를 설명하는 데 쓰인다.세 번째 주의사항은 static int my 입니다.match(struct device *dev, struct device driver *driver) 이것은 I 장치와 드라이브의 일치 함수로 버스의 핵심 기능입니다.그리고 EXPORTSYMBOL(my_bus);EXPORT_SYMBOL(my_bus_type);이 두 구조체의 내용을 외부에 사용하도록 주의해야 한다.
다음은 디바이스 프로그램에 대한 설명입니다.

#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>

MODULE_AUTHOR("David Xie");
MODULE_LICENSE("Dual BSD/GPL");

extern struct device my_bus; 
extern struct bus_type my_bus_type;

/* Why need this ?*/
static void my_dev_release(struct device *dev)
{ 
	
}

struct device my_dev = {
	.bus = &my_bus_type,
	.parent = &my_bus,
	.release = my_dev_release,
};

/*
 * Export a simple attribute.
 */
static ssize_t mydev_show(struct device *dev, char *buf)
{
	return sprintf(buf, "%s
", "This is my device!"); } static DEVICE_ATTR(dev, S_IRUGO, mydev_show, NULL); static int __init my_device_init(void) { int ret = 0; /* */ strncpy(my_dev.bus_id, "my_dev", BUS_ID_SIZE); // my_dev 。 /* */ device_register(&my_dev); /* */ device_create_file(&my_dev, &dev_attr_dev); return ret; } static void my_device_exit(void) { device_unregister(&my_dev); } module_init(my_device_init); module_exit(my_device_exit);

장치 프로그램에서 strncpy(my dev.bus id, my dev, BUS ID SIZE);//여기 mydev는 장치 파일의 이름입니다.이 안은 초기화 장치입니다. 초기화 장치가 my 를 호출했습니다.dev라는 구조체, mydev 구조체는 다음과 같습니다.
struct device my_dev = {  .bus = &my_bus_type,  .parent = &my_bus,  .release = my_dev_release, };
mydev 이 구조체 중bus = &mybus_type이 버스의 속성을 호출했기 때문에 장치가 버스 위에 걸려 있습니다.
마지막으로 드라이버:


#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>

MODULE_AUTHOR("David Xie");
MODULE_LICENSE("Dual BSD/GPL");

extern struct bus_type my_bus_type;

static int my_probe(struct device *dev)
{
    printk("Driver found device which my driver can handle!
"); return 0; } static int my_remove(struct device *dev) { printk("Driver found device unpluged!
"); return 0; } /* ① 。 (driver_register(&my_driver)) 。 ② 。 , static int my_match(struct device *dev, struct device_driver *driver)。 */ struct device_driver my_driver = { .name = "my_dev", .bus = &my_bus_type, .probe = my_probe, // 。 .remove = my_remove, }; /* * Export a simple attribute. */ static ssize_t mydriver_show(struct device_driver *driver, char *buf) { return sprintf(buf, "%s
", "This is my driver!"); } static DRIVER_ATTR(drv, S_IRUGO, mydriver_show, NULL); static int __init my_driver_init(void) { int ret = 0; /* */ driver_register(&my_driver); /* */ driver_create_file(&my_driver, &driver_attr_drv); return ret; } static void my_driver_exit(void) { driver_unregister(&my_driver); } module_init(my_driver_init); module_exit(my_driver_exit);

드라이버에서/* 드라이버 등록*/driverregister(&my_driver);이 함수는 my 를 호출했다driver라는 구조체, mydriver 구조체는 다음과 같습니다.
struct device_driver my_driver = {.name = "my dev",.bus = & my bus type,.probe = my probe,//버스에서 처리할 수 있는 장치를 처리합니다..remove = my remove,}
mydriver 이 구조체 중에는 주의해야 할 두 가지가 있는데, 하나."my dev"= "my dev"드라이버 이름입니다. 드라이버 이름은 버스 장치의 이름과 일치해야 드라이버를 실행할 수 있습니다.bus = &my_bus_type, 더 이상 말하지 않겠습니다. 이것이 바로 드라이브를 버스에 연결하는 것입니다.probe = my_probe, 이 함수에서 진정한 구체적인 구동을 실현합니다.
여기에는 단지 모형을 간단하게 말해서 다시 잘못 기억하지 않도록 했다.

좋은 웹페이지 즐겨찾기