bus
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
char bus_version[128] = "bus version v1";
int mybus_match(struct device *dev, struct device_driver *drv)
{
if(!strncmp(drv->name, dev->kobj.name, strlen(drv->name))){
printk("match ok\n");
return 1;
}else{
printk("match failed\n");
return 0;
}
}
struct bus_type mybus = {
.name = "my_bus",
.match = mybus_match,
};
ssize_t bus_version_show(struct bus_type *bus, char *buf)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
return snprintf(buf,128, "%s", bus_version);
}
ssize_t bus_version_store(struct bus_type *bus, const char *buf, size_t count)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
return snprintf(bus_version,count,"%s", buf);
}
struct bus_attribute bus_file_attr = {
.attr = {
.name = "bus_version",
.mode = 0666,
},
.show = bus_version_show,
.store = bus_version_store,
};
EXPORT_SYMBOL(mybus);
static int __init mybus_init(void)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
int ret;
ret = bus_register(&mybus);
if(ret != 0)
{
printk("bus_register");
return ret;
}
bus_create_file(&mybus, &bus_file_attr);
return 0;
}
static void __exit mybus_exit(void)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
bus_remove_file(&mybus,&bus_file_attr);
bus_unregister(&mybus);
}
module_init(mybus_init);
module_exit(mybus_exit);
MODULE_LICENSE("GPL");
——————————————
device
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include "mydevinfo.h"
struct mydev_info info = {
.name = "s5pv210_mydev",
.addr = 0xE0000060,
.irqno = 456,
.gpionum = 123,
};
extern struct bus_type mybus;
void mydev_release(struct device *dev)
{
}
struct device mydev = {
.init_name = "s5pv210_devdrv",
.bus = &mybus,
.release = mydev_release,
.platform_data = &info,
};
static int __init mydev_init(void)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
int ret;
ret = device_register(&mydev);
if(ret < 0)
{
printk("device_register error");
return ret;
}
return 0;
}
static void __exit mydev_exit(void)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
device_unregister(&mydev);
}
module_init(mydev_init);
module_exit(mydev_exit);
MODULE_LICENSE("GPL");
——————————————
driver
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include "mydevinfo.h"
extern struct bus_type mybus;
int mydrv_probe (struct device *dev)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
struct mydev_info *p = dev->platform_data;
printk("name = %s\n", p->name);
printk("addr = 0x%x\n", p->addr);
printk("gpio = %d\n", p->gpionum);
printk("irq = %d\n", p->irqno);
return 0;
}
int mydrv_remove (struct device *dev)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
return 0;
}
struct device_driver mydrv = {
.name = "s5pv210_devdrv",
.bus = &mybus,
.probe = mydrv_probe,
.remove = mydrv_remove,
};
static int __init mydrv_init(void)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
int ret;
ret = driver_register(&mydrv);
if(ret < 0)
{
printk("device_register error");
return ret;
}
return 0;
}
static void __exit mydrv_exit(void)
{
printk("-------^_^ %s-----------\n", __FUNCTION__);
driver_unregister(&mydrv);
}
module_init(mydrv_init);
module_exit(mydrv_exit);
MODULE_LICENSE("GPL");