arm嵌入式开发之ramdisk与IDE驱动

来源:互联网 发布:淘宝怎么虚假交易 编辑:程序博客网 时间:2024/04/29 22:10
1.ramdisk (ram)是一种虚拟磁盘,对应设备文件一般为:/dev/ram%d。
使用下面命令创建和挂载:
mkdir /tmp/ramdisk0
mke2fs /dev/ram0
mount /dev/ram0 /tmp/ramdisk0
设备模块加载和卸载函数:rd_init() rd_cleanup()
设备驱动block_device_operations及成员函数open()、ioctl():
static struct block_device_operations rd_bd_op={
    .owner=this_module,
    .open=rd_open,
    .ioctl=rd_ioctl,
};
static int rd_open(....);
static int rd_ioctl(....);
ramdisk 是完全随机设备,其驱动中易于使用制造请求函数而非请求函数,rd_make_request(); 
 2.ide硬盘设备
IDE为一种接口,有三种传输模式:pio,dma,udma。
linux内核中,IDE驱动相关的文件在/drivers/ide目录下,包含ide.c ide-cd.c ide-cd.h ide-disk.c ide-dma.c ide-floppy.c ide-generic.c ide-io.c ide-lib.c ide-probe.c ide-tape.c ide-taskfile.c ide-timing.c及针对arm ppc mips等外围IDE设备的驱动目录。
IDE的block_devices_operations及成员函数:
static struct block_device_operations idedisk_ops={
    .owner=this_module,
    .open=idedisk_open,
    .release=idedisk_release,
    .ioctl=idedisk_ioctl,
    .getgeo=idedisk_getgeo,//得到几何信息
    .media_changed=idedisk_media_changed,//媒介改变
    .revalidate_disk=idedisk_revalidate_disk//使介质有效
};
static int idedisk_ioctl();
static int idedisk_open();
static int idedisk_release();
IDE硬盘的io请求处理:
linux系统都IDE驱动进行了再封装,定义了ide_driver_t结构体,其容纳了IDE硬盘的探测,移除,请求处理和结束请求处理等函数指针。
static ide_driver_t idedisk_driver={
.gen_driver={
    .owner=this_module,
    .name="ide-disk",
    .bus=&ide_bus_type,
}
.probe=ide_disk_probe,//探测
.remove=ide_disk_remove,//移除
.shutdown=ide_disk_shutdown,
.version=IDEDISK_VERSION,
.media=ide_disk,//媒介类型
.supports_dsc_overlap=0,
.do_request=ide_do_rw_disk,
.endrequest=ide_end_request,
.error=__ide_error,
.abort=__ide_abort,//中止
.proc=idedisk_proc,
};
static  ide_startstop_t ide_do_rw_disk();其调用__ide_do_rw_disk()//完成io请求
而真正调用以ide_do_rw_disk()函数的是ide-io.c中start_request()函数,其滤过掉其他请求,将io操作请求传递给ide_do_rw_disk()函数。
在内核中增加都新系统IDE设备的支持:
使用ide_register_hw()函数可以注册IDE设备硬件接口,原型为int ide_register_hw(hw_regs_s *hw, ide_hwif_t **hwifp);
接收的两个参数对应的数据结构为
typedef struct hw_regs_s{
unsigned long io_ports[IDE_NR_POORTS];//task file寄存器
int irq;//中断号
int dma;//dma入口
ide_ack_intr_t chipset;
struct device *dev;
}hw_regs_t; 、
其是对IDE接口寄存器,中断号,dma入口描述,既是对硬件资源的描述。
typedef struct hwif_s{
...
char name[6];//接口名,如IDE0
hw_regs_t hw;//硬件信息
ide_drive_t drives[MAX_DRIVES];//驱动信息
u8 major;//主设备号
u8 index;//如果为0 。对应ide0
...
//DMA操作
..
//寄存器访问
....
}____cacheline_internodealigned_in_smp ide_hwif_t;
ide_hwif_t 是对IDE设备硬件访问 方法的描述。
为使新的IDE设备被检测到,要初始化两个结构体并使用ide_register_hw()注册IDE接口即可。 
原创粉丝点击