linux 驱动 insmod和probe函数
2015-11-05 16:54
507 查看
今天写了一个在2.6.35下的spi设备的驱动程序(写成模块,没编译进内核),按我对这类驱动程序的理解,该做的都做了,板文件都改过了,添加了spi_board_info,重新编译过,重新烧进板里了。
然后驱动函数实现了,init、exit、probe、remove、还有作为字符设备实现了操作集中的open、release、read、write等。。
问题是,当我insmod的时候是很顺利的,rmmod的时候也是很顺利的。insmod之后,/dev/下能找到我的设备文件的,问题是,不能用mknod(暂时忘了提示什么。。),同时,写一个c程序做测试,运行到open这个设备的时候,open函数的返回值是-1,即打不开,而且没有调用我写的open函数。。
回想一下,其实我的probe函数是有输出信息的,而实际情况中,从来没有见到这句话输出,所以想问一下到底什么时候会调用probe函数,还有insmod具体做了什么(本来以为insmod之后,内核发现有新的驱动,就会去match是否有新的设备,与此同时调用probe函数。。现在觉得理解错了)?
1个答案
票 数
![](http://www.dewen.io/theme/images/arrows.png)
1 票
443
最佳答案
probe函数的确是在driver和device绑定后执行的,一般建立device可以是静态的,也可以是动态建立,如果你想在arch下面的devices.c去静态建立设备,则你要注意你的spi_board_info是否有真正的注册到内核中去,示例代码如下:
static struct spi_board_info
xxx_spi0_board_info[] = {
{
.modalias = "xxx_spidev",
.bus_num = 0,
.chip_select = 0,
.max_speed_hz = 2 * 1000 *1000,
},
};
添加如上结构后,在devices.c最后面会有一个函数去注册spi_board_info:
static void __init
xxx_init_machine(void)
{
...
spi_register_board_info(xxx_spi0_board_info,
ARRAY_SIZE(xxx_spi0_board_info));
...
}
如果device成功创建,则需要检查驱动程序里面的spi_driver.id_table.name与spi_board_info.modalias是否一致,因为driver和device是否绑定就是比较这两个name是不是相同的。driver里面的示例代码如下:
static const struct spi_device_id
xxx_spidev_ids[] = {
{ "xxx_spidev", 1 },
{ },
};
MODULE_DEVICE_TABLE(spi, xxx_spidev_ids);
static struct spi_driver
xxx_spidev_spi_driver = {
.driver = {
.name
= "xxx_spidev",
.owner
= THIS_MODULE,
},
.id_table = xxx_spidev_ids,
.probe
= xxx_spidev_probe,
.remove = __devexit_p(xxx_spidev_remove),
};
insmod对我们来说最主要就是执行*.ko里面__init修饰的函数,一般在这个函数里面去注册driver,注册dirver的函数会通过name匹配是否有device存在,如果存在则执行probe函数。
关于动态建立device,spi调用的函数如下:
struct spi_device *spi_new_device(struct spi_master *master,
struct spi_board_info *chip)
对于它的具体用法可以在内核代码里面找到参考。
然后驱动函数实现了,init、exit、probe、remove、还有作为字符设备实现了操作集中的open、release、read、write等。。
问题是,当我insmod的时候是很顺利的,rmmod的时候也是很顺利的。insmod之后,/dev/下能找到我的设备文件的,问题是,不能用mknod(暂时忘了提示什么。。),同时,写一个c程序做测试,运行到open这个设备的时候,open函数的返回值是-1,即打不开,而且没有调用我写的open函数。。
回想一下,其实我的probe函数是有输出信息的,而实际情况中,从来没有见到这句话输出,所以想问一下到底什么时候会调用probe函数,还有insmod具体做了什么(本来以为insmod之后,内核发现有新的驱动,就会去match是否有新的设备,与此同时调用probe函数。。现在觉得理解错了)?
1个答案
票 数
![](http://www.dewen.io/theme/images/arrows.png)
1 票
443
最佳答案
probe函数的确是在driver和device绑定后执行的,一般建立device可以是静态的,也可以是动态建立,如果你想在arch下面的devices.c去静态建立设备,则你要注意你的spi_board_info是否有真正的注册到内核中去,示例代码如下:
static struct spi_board_info
xxx_spi0_board_info[] = {
{
.modalias = "xxx_spidev",
.bus_num = 0,
.chip_select = 0,
.max_speed_hz = 2 * 1000 *1000,
},
};
添加如上结构后,在devices.c最后面会有一个函数去注册spi_board_info:
static void __init
xxx_init_machine(void)
{
...
spi_register_board_info(xxx_spi0_board_info,
ARRAY_SIZE(xxx_spi0_board_info));
...
}
如果device成功创建,则需要检查驱动程序里面的spi_driver.id_table.name与spi_board_info.modalias是否一致,因为driver和device是否绑定就是比较这两个name是不是相同的。driver里面的示例代码如下:
static const struct spi_device_id
xxx_spidev_ids[] = {
{ "xxx_spidev", 1 },
{ },
};
MODULE_DEVICE_TABLE(spi, xxx_spidev_ids);
static struct spi_driver
xxx_spidev_spi_driver = {
.driver = {
.name
= "xxx_spidev",
.owner
= THIS_MODULE,
},
.id_table = xxx_spidev_ids,
.probe
= xxx_spidev_probe,
.remove = __devexit_p(xxx_spidev_remove),
};
insmod对我们来说最主要就是执行*.ko里面__init修饰的函数,一般在这个函数里面去注册driver,注册dirver的函数会通过name匹配是否有device存在,如果存在则执行probe函数。
关于动态建立device,spi调用的函数如下:
struct spi_device *spi_new_device(struct spi_master *master,
struct spi_board_info *chip)
对于它的具体用法可以在内核代码里面找到参考。
相关文章推荐
- Linux Linker 的顺序
- Linux find命令简明
- 查看Linux下的文件
- 查看Linux下的文件
- linux mysql 优化
- ARM+Linux系统启动流程分析----ARM处理器的启动流程
- ARM+Linux系统启动流程分析----系统启动总概述
- linux中的vi编辑器(二)
- rsync和sersync实现数据实时同步
- 统计文件行数
- Linux安装MYsql(yum)
- linux 12个进程管理命令
- read 系统调用剖析
- linux下 安装php的gettext模块
- linux查看进程树
- centos xmanage
- linux 下面不能使用fflush(stdin)
- linux route 命令为什么需要很长的时间响应
- CentOS 6.5 LVM磁盘管理学习笔记
- 详解linux下的串口通讯开发