From: Brian M. <br...@so...> - 2011-04-28 21:54:50
|
I'm a hardware guy trying to add some functionality to smartmontools to support the longevity statistics features of a particular kind of solid state drive. I can't discuss details because I'm under NDA. I am attempting to get some sample code written for linux and provided by the SSD manufacturer to work. Unfortunately, this code foolishly talks to the hardware directly (circumventing the kernel) so I'm trying to port its functionality into smartmontools so I can use an ioctl to talk to the device. However, after I added the code I realized that the object oriented nature of smartmontools seems to prevent me from making the ioctl call directly and it seems the code needs to live at the os_linux.cpp level. I started moving the ioctl calling routine to os_linux.cpp and realized that I don't know how many layers I have to go through to get to my function and every time I attempt to understand the inner workings of the code I feel as if I'm lost in a sea of red tape. I think my confusion comes in from the inheritance aspects of the code that relies on code that lives outside it, or something like that. I noticed the linux_escelade_device::ata_pass_through call and thought I might be able to use its general purpose structure directly or at least as an example, but alas, I can't see how its called from the main line code either. The reason I need to add my own ioctl is simply that the smart commands that this particular solid state drive uses require me to set the ata commands to something very specific for extra features. In other words I have to set the head, sector etc to specific values to get to the "extended" smart capabilities of the drive. I was hoping someone could give me a shove in the right direction. Should I create a parallel, "linux_ata_device::ata_command_interface" that gives me control of the other ata command registers (as I had originally thought)? Or is there a way to use ata_pass_through? Or is there some better way, a way that doesn't require changing anything at the os_linux level? Any advice would be greatly appreciated. By the way: I'm doing this because my software Engineering coworkers are rather busy with our product code. This bit of test software is something I'm hoping I can write to save them time and effort. Thanks in advance, Brian |