bus, device 및 driver
우선 버스 프로그램 부분을 살펴보겠습니다.
/* */
#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, 이 함수에서 진정한 구체적인 구동을 실현합니다.
여기에는 단지 모형을 간단하게 말해서 다시 잘못 기억하지 않도록 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.