Mercurial > ecos
view examples/serial.c @ 2300:654c837cc618
* include/disk.h (DISK_CHANNEL): No need for extra _part_dev
slot intended for entire disk's own devtab.
* src/disk.c (disk_lookup): Just access pdevs_dev directly
with no adjusted offset.
(disk_init): No longer set entry 0 from device devtab.
It's unnecessary.
* include/disk.h: Merge eCosCentric CVS with public eCos CVS.
This merges (and therefore changes) the API. ChangeLog
entries have been incorporated in the correct places below.
* include/diskio.h: Also merged.
* cdl/io_disk.cdl: Also merged.
* src/disk.c: Also merged.
* src/disk.c (read_partition): Switched to favour LBA partition
information in partition tables. This also means we don't now rely
on the driver reporting a correct CHS size for the disk.
(disk_bread, disk_bwrite): API changed to take length in sectors
rather than bytes. Also call hardware driver to transfer in
(up to) max_transfer sized chunks, rather than a sector at a
time. Call in to driver now made with DSR lock claimed, to avoid a
race condition between the DSR and the calling thread.
(disk_get_config): Added phys_block_size to channel info.
* include/diskio.h (struct cyg_disk_identify_t): Added
phys_block_size and max_transfer fields. These must be filled in
by the driver.
* include/disk.h (DISK_CHANNEL_INIT): New macro. Allows a
DISK_CHANNEL to be defined dynamically.
* src/disk.c (disk_bread, disk_bwrite): Made calls to
cyg_thread_yield() dependent on presence ok kernel.
* src/disk.c (disk_bwrite): Uncomment the cyg_thread_yield() at
the end to prevent thread starvation between threads at the same
priority.
(disk_bread): Ditto.
* src/disk.c (read_partition): Changed to account for very large
disks which report bogus CHS geometry. We can only use the LBA
partition parameters in such disks.
(disk_set_config): Added some extra debug output.
* src/disk.c:
Various changes to support disconnect/reconnect of changeable
media.
* include/diskio.h: Added mount counter to disk_info structure.
* include/disk.h: Changed disk_disconnected() function to take a
pointer to a struct disk_channel rather than a struct
cyg_devtab_entry. Added mount count to disk_channel structure.
Moved include of diskio.h to end to fix declaration problems.
* src/disk.c: Fixed bug in write routine where controller result
field was not being initialized. Added signals on controller queue
condition variable after setting controller busy flag to false.
* include/disk.h: Made controller result and busy fields
volatile. Just in case.
* include/disk.h:
* src/disk.c:
Many changes. Added additional disk_controller data structure to
better reflect hardware structure. Added support for serialization
of multithreaded accesses to a single controller. Added support
for asynchronous, interrupt driven, IO operations. Various
tidies.
| author | jlarmour |
|---|---|
| date | Thu, 21 Sep 2006 16:38:38 +0000 |
| parents | ead06911cbae |
| children |
line wrap: on
line source
/* * Written 1999-03-19 by Jonathan Larmour, Cygnus Solutions * This file is in the public domain and may be used for any purpose */ /* CONFIGURATION CHECKS */ #include <pkgconf/system.h> /* which packages are enabled/disabled */ #ifdef CYGPKG_KERNEL # include <pkgconf/kernel.h> #endif #ifdef CYGPKG_LIBC # include <pkgconf/libc.h> #endif #ifdef CYGPKG_IO_SERIAL # include <pkgconf/io_serial.h> #endif #ifndef CYGFUN_KERNEL_API_C # error Kernel API must be enabled to build this example #endif #ifndef CYGPKG_LIBC_STDIO # error C library standard I/O must be enabled to build this example #endif #ifndef CYGPKG_IO_SERIAL_HALDIAG # error I/O HALDIAG pseudo-device driver must be enabled to build this example #endif /* INCLUDES */ #include <stdio.h> /* printf */ #include <string.h> /* strlen */ #include <cyg/kernel/kapi.h> /* All the kernel specific stuff */ #include <cyg/io/io.h> /* I/O functions */ #include <cyg/hal/hal_arch.h> /* CYGNUM_HAL_STACK_SIZE_TYPICAL */ /* DEFINES */ #define NTHREADS 1 #define STACKSIZE ( CYGNUM_HAL_STACK_SIZE_TYPICAL + 4096 ) /* STATICS */ static cyg_handle_t thread[NTHREADS]; static cyg_thread thread_obj[NTHREADS]; static char stack[NTHREADS][STACKSIZE]; /* FUNCTIONS */ static void simple_prog(CYG_ADDRESS data) { cyg_io_handle_t handle; Cyg_ErrNo err; const char test_string[] = "serial example is working correctly!\n"; cyg_uint32 len = strlen(test_string); printf("Starting serial example\n"); err = cyg_io_lookup( "/dev/haldiag", &handle ); if (ENOERR == err) { printf("Found /dev/haldiag. Writing string....\n"); err = cyg_io_write( handle, test_string, &len ); } if (ENOERR == err) { printf("I think I wrote the string. Did you see it?\n"); } printf("Serial example finished\n"); } void cyg_user_start(void) { cyg_thread_create(4, simple_prog, (cyg_addrword_t) 0, "serial", (void *)stack[0], STACKSIZE, &thread[0], &thread_obj[0]); cyg_thread_resume(thread[0]); }
