2012-10-08 31 views
9

Tôi đang làm việc trên trình cài đặt trong OS X để cài đặt trình điều khiển IOKit cho thiết bị USB và tôi đang cố gắng để không yêu cầu khởi động lại ở cuối. Trình cài đặt cài đặt trình điều khiển chính xác và xây dựng lại bộ nhớ cache kext, và sau khi nó chạy, nếu tôi rút phích cắm và cắm lại thiết bị USB, nó tải đúng trình điều khiển mới và mọi thứ hoạt động tốt.Lập trình "rút phích cắm và cắm lại" thiết bị USB để tải trình điều khiển mới trong OS X?

Tuy nhiên, tôi không muốn yêu cầu người dùng phải rút phích cắm thiết bị về mặt vật lý để trình điều khiển mới tải. Đã có một cách để có được OS X để tải các trình điều khiển mới lập trình - trong hiệu ứng mô phỏng các thiết bị được rút phích cắm và cắm lại trong một lần nữa, hoặc một cái gì đó tương tự. Tôi sẽ đi đâu để tới đó? Cho đến nay, giờ Googling đã không có gì, vì vậy bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao!

+0

Tôi muốn thử nhìn vào mã mà được chạy khi bạn đẩy một thiết bị lưu trữ USB - Tôi không chắc chắn nếu có tương ứng với lưu lượng USB hoặc nếu nó chỉ yêu cầu hệ thống con USB bỏ qua cổng cho đến khi ngắt kết nối vật lý. Trong trường hợp trước đây (một thông báo "USB đẩy"), có thể không có cách dễ dàng để "bỏ đẩy" ngoài việc chạy xe đạp hoặc thiết lập lại USB, cả hai có thể có vấn đề đối với các thiết bị USB khác. Nhưng hy vọng đó là một nơi nào đó để bắt đầu tìm kiếm. –

+0

Tôi đã đọc về một thứ gọi là 'pmount' có thể ngắt kết nối nhiều thiết bị USB tùy ý hơn, nhưng tôi không biết liệu có bao gồm thiết bị của bạn hay không. Nhược điểm lớn duy nhất là nó không đi kèm với OS X theo mặc định. – rien333

+0

Tôi khá chắc chắn bạn không thể thực hiện việc này trực tiếp từ không gian người dùng. Tuy nhiên, trong hạt nhân, bạn có thể thử gọi terminate() trên máy khách hiện tại đang hogging thiết bị. – pmdj

Trả lời

2

IOUSBDeviceInterface187 :: USBDeviceReEnumerate() sẽ thực hiện những gì bạn muốn. Hitch duy nhất là tìm tất cả các thiết bị quan tâm và gọi nó theo cách thủ công với IOServiceGetMatchingServices().

/*! 
@function USBDeviceReEnumerate 
@abstract Tells the IOUSBFamily to reenumerate the device. 
@discussion This function will send a terminate message to all clients of the IOUSBDevice (such as 
      IOUSBInterfaces and their drivers, as well as the current User Client), emulating an unplug 
      of the device. The IOUSBFamily will then enumerate the device as if it had just 
      been plugged in. This call should be used by clients wishing to take advantage 
      of the Device Firmware Update Class specification. The device must be open to use this function. 
@availability This function is only available with IOUSBDeviceInterface187 and above. 
@param  self Pointer to the IOUSBDeviceInterface. 
@param  options A UInt32 reserved for future use. Ignored in current implementation. Set to zero. 
@result  Returns kIOReturnSuccess if successful, kIOReturnNoDevice if there is no connection to an IOService, 
      or kIOReturnNotOpen if the device is not open for exclusive access. 
*/ 

IOReturn (*USBDeviceReEnumerate)(void *self, UInt32 options); 

Look in IOKit/usb/IOUSBLib.h

1

Hãy xem diskutil và đặc biệt là các tùy chọn mountunmount. Những thiết bị này sẽ đẩy mạnh và lắp đặt thiết bị. Bạn có thể sử dụng diskutil list để có danh sách tất cả các thiết bị hiện đang được gắn. Nếu bạn cần thêm thông tin về diskutil, chỉ cần nhìn vào trang người đàn ông.

+0

Thật không may thiết bị này không phải là một đĩa, nó là một thiết bị giao diện con người, vì vậy theo như tôi biết diskutil sẽ không giúp đỡ. – GuyGizmo

+0

Ah, tôi hiểu rồi. Lỗi của tôi. – rien333

Các vấn đề liên quan