天嵌 ARM开发社区

 找回密码
 注册
查看: 2036|回复: 7

初次接触总线设备驱动模型出现的oops

[复制链接]
记事本 发表于 2011-12-14 10:37:28 | 显示全部楼层 |阅读模式
bus.c
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
MODULE_AUTHOR("yue wen");
MODULE_LICENSE("Dual BSD/GPL");
static char *Version = "$Revision: 1.9 $";
static int my_match(struct device *dev, struct device_driver *driver)
{
return !strncmp(dev->init_name, driver->name, strlen(driver->name));
}
static void my_bus_release(struct device *dev)
{
printk(KERN_DEBUG "my bus release\n");
}

struct device my_bus = {
.init_name   = "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\n", 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!\n");

/*注册总线设备*/
ret = device_register(&my_bus);
if (ret)
  printk(KERN_NOTICE "Fail to register device:my_bus!\n");
  
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);

device.c
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
MODULE_AUTHOR("yue wen");
MODULE_LICENSE("Dual BSD/GPL");
extern struct device my_bus;
extern struct bus_type my_bus_type;

static void my_dev_release(struct device *dev)
{

}
struct device my_dev = {
.init_name="my_dev",
.bus = &my_bus_type,//新创建的设备挂载在my_bus总线上
.parent = &my_bus,//新创建的设备的父目录
.release = my_dev_release,
};
/*
* Export a simple attribute.
*/
static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf)
{
return sprintf(buf, "%s\n", "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.init_name, "my_dev", NULL);
        
        /*注册设备*/
device_register(&my_dev);
  
/*创建属性文件*/
device_create_file(&my_dev, &dev_attr_dev);//属性文件名称为dev

return ret;
}
static void my_device_exit(void)
{
device_unregister(&my_dev);
}
module_init(my_device_init);
module_exit(my_device_exit);



driver.c
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
MODULE_AUTHOR("yue wen");
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!\n");
    return 0;
}
static int my_remove(struct device *dev)
{
    printk("Driver found device unpluged!\n");
    return 0;
}
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\n", "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);

Makefile文件
ifneq ($(KERNELRELEASE),)
obj-m := device.o
else

KDIR := /opt/EmbedSky/linux-2.6.30.4
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*
endif

在加载driver.ko文件的时候出现了如图所示的信息,我在加载device.ko的时候也出现了但是修改之后通过了!提示好像是bus.c文件里的my_match函数有错误,大侠们帮我看看吧!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 记事本 发表于 2011-12-14 10:40:54 | 显示全部楼层
上图不太完整 重新传个图吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 记事本 发表于 2011-12-14 10:45:33 | 显示全部楼层
哎  版主给看看吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
embedsky_lhh 发表于 2011-12-14 14:09:14 | 显示全部楼层
本帖最后由 embedsky_lhh 于 2011-12-14 15:17 编辑

你先得加bus 然后再加载device然后再driver才行啊
 楼主| 记事本 发表于 2011-12-14 14:40:42 | 显示全部楼层
本帖最后由 embedsky_lhh 于 2011-12-14 15:29 编辑
embedsky_lhh 发表于 2011-12-14 14:09
你先得加bus 然后再加载device然后再driver才行啊


我就是先加了bus啊 至于device和driver应该是没顺序吧!
embedsky_lhh 发表于 2011-12-14 16:00:03 | 显示全部楼层
你两个驱动加载的时候都报错吗
 楼主| 记事本 发表于 2011-12-14 19:15:32 | 显示全部楼层
embedsky_lhh 发表于 2011-12-14 16:00
你两个驱动加载的时候都报错吗

不是 最后加的那个报错!我试过了,不论是device还是driver,只有最后加的那个才报错!
embedsky_lhh 发表于 2011-12-15 09:30:57 | 显示全部楼层
那你加载成功的那个有注册成功吗?
int ret = 0;
        
        /* 初始化设备 */
// strncpy(my_dev.init_name, "my_dev", NULL);
        
        /*注册设备*/
device_register(&my_dev);
  
/*创建属性文件*/
device_create_file(&my_dev, &dev_attr_dev);//属性文件名称为dev

return ret;
像这些代码你可以根据注册时返回值来判断下注册是否成功?这才好一步步找原因啊,你多加点调试信息到里边。看了下代码,你说my_match有问,我没看出哪有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-7-3 01:45 , Processed in 1.078132 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表