/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2006 Jonathan Gordon * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #ifndef __ATACALLBACK_H__ #define __ATACALLBACK_H__ #include #include "events.h" /* NOTE: ata_idle_notify usage notes.. 1) The callbacks are called in the ata thread, not main/your thread. 2) Asynchronous callbacks (like the buffer refill) should be avoided. If you must use an async callback, remember to check ata_is_active() before accessing the disk, and do not call any functions between that check and the disk access which may cause a yield (lcd_update() does this!). 3) Do not call any yielding functions in the callback. 4) Do not call ata_sleep in the callbacks. 5) Don't Panic! */ enum { DISK_EVENT_SPINUP = (EVENT_CLASS_DISK|1), }; #define USING_ATA_CALLBACK !defined(SIMULATOR) \ && !defined(HAVE_FLASH_DISK) typedef bool (*ata_idle_notify)(void); extern void register_ata_idle_func(ata_idle_notify function); #if USING_ATA_CALLBACK extern void unregister_ata_idle_func(ata_idle_notify function, bool run); extern bool call_ata_idle_notifys(bool force); #else #define unregister_ata_idle_func(f,r) #define call_ata_idle_notifys(f) #define ata_idle_notify_init(s) #endif #endif /* __ATACALLBACK_H__ */