NeXTSTEPDRIVERKIT:Chapter2 2
- Creating and Initializing Drivers
드라이버의 생성 및 초기화
You must override the probe: class method of IODevice in your subclass. This important method looks for the hardware and instantiates and initializes a device driver. The IODeviceDescription object passed as the parameter to probe: provides information about the driver object, including configuration information.
하위 클래스에서 IODevice 의 probe: 클래스 메소드를 오버라이드해야 합니다. 이 중요한 메소드는 하드웨어를 찾고, 디바이스 드라이버를 인스턴스화하고 초기화 합니다. probe: 에 대한 매개 변수로 전달된 IODeviceDescription 객체는, 설정(configuration) 정보를 포함해서 드라이버 객체에 대한 정보를 제공합니다.
Warning: You should use the alloc and initFromDeviceDescription: methods to instantiate and initialize a driver—not the new method.
Warning: new 메서드를 사용하는것이 아니라, alloc 및 initFromDeviceDescription: 메소드를 사용해서 드라이버를 초기화하고 초기화하십시오.
For direct device drivers, the IODeviceDescription parameter contains architecture-specific information about a device, such as its DMA channels and interrupts. Your driver subclass should determine whether the device is really present. If so, it should create an instance of itself, using the information in the IODeviceDescription. IODeviceDescription and its subclasses provide access to the device information.
직접 장치 드라이버의 경우 IODeviceDescription 매개 변수에는 DMA 채널 및 인터럽트와 같은, 장치에 대한 아키텍처 관련 정보가 들어 있습니다. 드라이버 하위 클래스는 장치가 실제로 있는지의 여부를 결정해야합니다. 그렇게 하기 위해서 IODeviceDescription의 정보를 사용해서 자체의 인스턴스를 만들어야합니다. IODeviceDescription과 하위 클래스는 장치 정보에 대한 접근을 제공합니다.
After probe: instantiates the driver, it should invoke the initFromDeviceDescription: method to initialize the instance (with help from some other methods, too). You typically override this method, although you should incorporate the superclass's implementation by invoking this message on super prior to performing the rest of your initialization.
probe: 가 드라이버를 인스턴스화 한 뒤에 initFromDeviceDescription: 메소드를 호출해서 인스턴스를 초기화해야 합니다(이 방법은 다른 메서드에게도 도움이 됩니다). 초기화의 나머지 부분을 수행하기 전에, 상위 클래스에서 이 메시지를 호출해서 수퍼 클래스의 구현을 통합해야 하지만, 일반적인 경우라면 이 메서드를 재정의합니다.
[super initFromDeviceDescription:aDeviceDescription];
Look at this method's description in your driver's superclass to see what functions it provides for you. For example, the IODirectDevice class's initFromDeviceDescription: reserves address ranges, DMA channels, and IRQs (interrupt numbers) for a driver.
드라이버의 상위 클래스에서 이 메소드의 설명을 확인하고, 당신에게 제공되는 기능을 확인하십시오. 예를 들어, IODirectDevice 클래스의 initFromDeviceDescription: 은 드라이버의 주소 범위, DMA 채널 및 IRQ (인터럽트 번호)를 예약합니다.
The initialization sequence must also include registering the driver with registerDevice so the rest of the system knows about the driver.
초기화 시퀀스에는 registerDevice 로 드라이버를 등록해야 시스템의 나머지 부분에서 드라이버를 알 수 있습니다.
For direct device drivers, attach interrupts using attachInterruptPort or some other method that invokes attachInterruptPort. IODirectDevice's startIOThread invokes it, for example.
직접 장치 드라이버의 경우 attachInterruptPort 또는 attachInterruptPort 를 호출하는 다른 메서드를 사용해서 인터럽트를 연결하십시오. 예를 들어, IODirectDevice 의 startIOThread 가 이것을 호출합니다.
Here's a skeleton of the probe: method for a direct device driver of the class MyClass. Italicized text delineated in angle brackets, that is << >>, is to be filled in with device-specific code.
다음은 MyClass 클래스의 직접 디바이스 드라이버에 대한 probe: 메소드의 뼈대입니다. 꺾쇠 괄호로 의 기울임 꼴로 표시된 텍스트 << >> 는 장치 관련 코드로 채워집니다[1].
+ (BOOL)probe:devDesc
{
MyClass *instance = [self alloc];
IOEISADeviceDescription
*deviceDescription = (IOEISADeviceDescription *)devDesc;if (instance == nil)
return NO;
/* Check the device description to see that we have some
* I/O ports, mapped memory, and interrupts assigned. */
if ([deviceDescription numPortRanges] < 1
|| [deviceDescription numMemoryRanges] < 1
|| [deviceDescription numInterrupts] < 1) {
[instance free];
return NO;
}
<< Perform more device-specific validation, e.g. checking to make
sure the I/O port range is large enough. Make sure the
hardware is really there. Return NO if anything is wrong.>>
return [instance initFromDeviceDescription:devDesc] != nil;
}
If your driver subclass that receives the probe: message is an indirect device driver, the IODeviceDescription specifies an IODevice instance (typically for a direct device) that the indirect device driver might want to work with to communicate with its hardware. For example, if the indirect device driver controls SCSI disks, then the IODeviceDescriptions it receives specify instances of IOSCSIController, a direct device driver. Your driver should determine whether it needs to use the hardware controlled by the specified IODevice instance (for example, whether the SCSI controller has disks attached). If so, your driver subclass should create instances of itself. Here's an outline of probe: for this case:
probe: 메시지를 받는 드라이버 하위 클래스가 간접 장치 드라이버 인 경우, IODeviceDescription 은 간접 장치 드라이버가 하드웨어와 통신하기를 원할 수도 있는 IODevice 인스턴스 (일반적으로 직접 장치)를 지정합니다. 예를 들어, 간접 장치 드라이버가 SCSI 디스크를 제어하면, 받은 IODeviceDescriptions 는 직접 장치 드라이버인 IOSCSIController 의 인스턴스를 지정하게 됩니다. 드라이버는 지정된 IODevice 인스턴스에 의해 제어되는 하드웨어를 사용해야 하는지의 여부를 결정해야합니다(예를 들어, SCSI 컨트롤러에 디스크가 연결되어 있는지 여부). 그렇다면 드라이버 하위 클래스가 자체의 인스턴스를 만들어야합니다. 이 사건에 대한 probe: 의 개요는 다음과 같습니다.
+ (BOOL)probe:deviceDescription
{
MyIndirectDevice *instance = nil;
/*Get IODirectDevice object this indirect device is connected to*/
id controller = [deviceDescription directDevice];
BOOL rtn = NO;
for (<< each possible device attached to the direct device >>)
{
if (instance == nil)
instance = [MyIndirectDevice alloc];
if (<< we can't reserve this device
(implying that another driver controls it) >>) {
continue;
}
<< Check whether the device really exists and is a device we
can control.
If so, initialize an instance of this driver
with a driver-specific version of init. For example:
initRtn = [instance initWithController:controller];>>
if (<< the instance was successfully initialized >>) {
[instance registerDevice];
/* Do any other driver-specific initialization. */
instance = nil;
rtn = YES;
break;
}
else
<< Release our reservation for this device >>
} /* end of for loop */
if(instance) {
/* Free up any leftover indirect devices. */
[instance free];
}
return rtn;
}
Besides the information specific to direct or indirect devices, the IODeviceDescription's IOConfigTable contains miscellaneous configuration information. A beep driver's configuration table, for example, might specify that the driver is a sound-related device and specify the frequency of beeps. The IOConfigTable can be retrieved from the IODeviceDescription using the configTable method. The probe: method or methods that it invokes may do further initialization using this information.
직접 또는 간접 장치에 대한 고유한 정보 외에도 IODeviceDescription 의 IOConfigTable 에는 기타 설정 정보(miscellaneous configuration information)가 들어 있는데, 예를 들어, 경고음 드라이버의 설정 표(configuration table)는 드라이버가 소리 관련 장치임을 지정하고 경고음 발생 빈도를 지정할 수 있습니다. IOConfigTable 은 configTable 메소드를 사용해서 IODeviceDescription 내를 검색 할 수 있습니다. probe: 메소드 또는 메소드가 호출되면 이 정보를 사용하여 초기화를 추가로 수행할 수 있습니다.
Notes
- ↑ 장치 관련된 description 을 의미하는듯 합니다.