| |
================================
Author: taoyuetao
Email: tao_yuetao@yahoo.com.cn
Blog: http://www.eetop.cn/blog/?11145
07-03-11
================================
看到网上有人问ecos对ioctl的实现过程,以前也没有关心过,一直是通过cyg_io_get_config和cyg_io_set_config
函数操作设备的,赶紧看了一下源码,终于弄明白了ecos对ioctl的支持是怎样的:
ioctl函数在packages/io/fileio/current/src/io.cxx中,
它调用的底层函数是通过:
ret = fp->f_ops->fo_ioctl(fp, com, data);
它是通过对文件句柄的f_ops的ioctl函数指针来实现ioctl功能的,这和linux基本相同,
跟踪设备操作时fo_ioctl的运行,ecos也有设备文件系统(和linux一样),
文件packages/io/fileio/current/src/devfs.cxx中就是设备文件系统的实现,
这里定义了一个cyg_fileops结构函数数组指针dev_fileops用于操作设备,
其中dev_fo_ioctl就是对应ioctl中调用到的fo_ioctl函数,它的函数实现是空的,
也就是说如果通过ioctl直接对设备进行操作,是不成的,
再看一下ecos文件操作和linux的不同处,在f_ops结构中最后还定义了两个函数指针:
fo_getinfo,fo_setinfo,在devfs中对应dev_fo_setinfo和dev_fo_getinfo,看一下
他的函数实现,分别调用的是cyg_io_get_config和cyg_io_set_config,所以实际上
还是要通过这两个函?词迪謎octl功能,
另外fo_getinfo,fo_setinfo对应上层的系统调用也在io.cxx中,分别是
cyg_fs_fsetinfo和cyg_fs_fgetinfo,
如果你想要使用ioctl来对设备操作,那就填写dev_fo_ioctl函数(devfs.cxx),无论怎样
都要归到cyg_io_get_config和cyg_io_set_config这两个函数