annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
168
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
1 /*
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
2 * Written 1999-03-19 by Jonathan Larmour, Cygnus Solutions
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
3 * This file is in the public domain and may be used for any purpose
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
4 */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
5
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
6 /* CONFIGURATION CHECKS */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
7
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
8 #include <pkgconf/system.h> /* which packages are enabled/disabled */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
9 #ifdef CYGPKG_KERNEL
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
10 # include <pkgconf/kernel.h>
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
11 #endif
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
12 #ifdef CYGPKG_LIBC
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
13 # include <pkgconf/libc.h>
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
14 #endif
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
15 #ifdef CYGPKG_IO_SERIAL
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
16 # include <pkgconf/io_serial.h>
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
17 #endif
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
18
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
19 #ifndef CYGFUN_KERNEL_API_C
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
20 # error Kernel API must be enabled to build this example
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
21 #endif
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
22
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
23 #ifndef CYGPKG_LIBC_STDIO
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
24 # error C library standard I/O must be enabled to build this example
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
25 #endif
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
26
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
27 #ifndef CYGPKG_IO_SERIAL_HALDIAG
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
28 # error I/O HALDIAG pseudo-device driver must be enabled to build this example
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
29 #endif
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
30
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
31 /* INCLUDES */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
32
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
33 #include <stdio.h> /* printf */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
34 #include <string.h> /* strlen */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
35 #include <cyg/kernel/kapi.h> /* All the kernel specific stuff */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
36 #include <cyg/io/io.h> /* I/O functions */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
37 #include <cyg/hal/hal_arch.h> /* CYGNUM_HAL_STACK_SIZE_TYPICAL */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
38
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
39
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
40
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
41 /* DEFINES */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
42
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
43 #define NTHREADS 1
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
44 #define STACKSIZE ( CYGNUM_HAL_STACK_SIZE_TYPICAL + 4096 )
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
45
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
46 /* STATICS */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
47
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
48 static cyg_handle_t thread[NTHREADS];
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
49 static cyg_thread thread_obj[NTHREADS];
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
50 static char stack[NTHREADS][STACKSIZE];
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
51
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
52 /* FUNCTIONS */
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
53
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
54 static void simple_prog(CYG_ADDRESS data)
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
55 {
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
56 cyg_io_handle_t handle;
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
57 Cyg_ErrNo err;
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
58 const char test_string[] = "serial example is working correctly!\n";
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
59 cyg_uint32 len = strlen(test_string);
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
60
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
61 printf("Starting serial example\n");
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
62
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
63 err = cyg_io_lookup( "/dev/haldiag", &handle );
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
64
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
65 if (ENOERR == err) {
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
66 printf("Found /dev/haldiag. Writing string....\n");
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
67 err = cyg_io_write( handle, test_string, &len );
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
68 }
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
69
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
70 if (ENOERR == err) {
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
71 printf("I think I wrote the string. Did you see it?\n");
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
72 }
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
73
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
74 printf("Serial example finished\n");
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
75
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
76 }
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
77
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
78 void cyg_user_start(void)
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
79 {
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
80 cyg_thread_create(4, simple_prog, (cyg_addrword_t) 0, "serial",
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
81 (void *)stack[0], STACKSIZE, &thread[0], &thread_obj[0]);
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
82 cyg_thread_resume(thread[0]);
ead06911cbae Add up-to-date examples
jlarmour
parents:
diff changeset
83 }