diff --git a/source/common.c b/source/common.c index 7405d67..f0c8ee2 100644 --- a/source/common.c +++ b/source/common.c @@ -53,90 +53,89 @@ int module_setup = 0; int DEBUG = 0; pins_t pins_info[] = { - { "GND", "GND", "U13_1", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CHG-IN", "CHG-IN", "U13_2", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "VCC-5V", "VCC-5V", "U13_3", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "GND", "GND", "U13_4", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "VCC-3V3", "VCC-3V3", "U13_5", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "TS", "TS", "U13_6", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "VCC-1V8", "VCC-1V8", "U13_7", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "BAT", "BAT", "U13_8", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "TWI1-SDA", "KPD-I2C-SDA", "U13_9", 48, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "PWRON", "PWRON", "U13_10", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "TWI1-SCK", "KPD-I2C-SCL", "U13_11", 47, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "GND", "GND", "U13_12", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "X1", "X1", "U13_13", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "X2", "X2", "U13_14", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "Y1", "Y1", "U13_15", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "Y2", "Y2", "U13_16", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D2", "LCD-D2", "U13_17", 98, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "PWM0", "PWM0", "U13_18", 34, BASE_METHOD_AS_IS, 0, -1, SPWM_DISABLED}, - { "LCD-D4", "LCD-D4", "U13_19", 100, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D3", "LCD-D3", "U13_20", 99, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D6", "LCD-D6", "U13_21", 102, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D5", "LCD-D5", "U13_22", 101, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D10", "LCD-D10", "U13_23", 106, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D7", "LCD-D7", "U13_24", 103, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D12", "LCD-D12", "U13_25", 108, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D11", "LCD-D11", "U13_26", 107, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D14", "LCD-D14", "U13_27", 110, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D13", "LCD-D13", "U13_28", 109, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D18", "LCD-D18", "U13_29", 114, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D15", "LCD-D15", "U13_30", 111, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D20", "LCD-D20", "U13_31", 116, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D19", "LCD-D19", "U13_32", 115, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D22", "LCD-D22", "U13_33", 118, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D21", "LCD-D21", "U13_34", 117, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-CLK", "LCD-CLK", "U13_35", 120, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-D23", "LCD-D23", "U13_36", 119, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-VSYNC", "LCD-VSYNC", "U13_37", 123, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-HSYNC", "LCD-HSYNC", "U13_38", 122, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "GND", "GND", "U13_39", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LCD-DE", "LCD-DE", "U13_40", 121, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "GND", "GND", "U14_1", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "VCC-5V", "VCC-5V", "U14_2", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "UART1-TX", "UART-TX", "U14_3", 195, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "HPL", "HPL", "U14_4", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "UART1-RX", "UART-RX", "U14_5", 196, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "HPCOM", "HPCOM", "U14_6", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "FEL", "FEL", "U14_7", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "HPR", "HPR", "U14_8", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "VCC-3V3", "VCC-3V3", "U14_9", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "MICM", "MICM", "U14_10", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "LRADC", "ADC", "U14_11", -1, BASE_METHOD_AS_IS, -1, 0, SPWM_DISABLED}, - { "MICIN1", "MICIN1", "U14_12", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "XIO-P0", "XIO-P0", "U14_13", 0, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "XIO-P1", "XIO-P1", "U14_14", 1, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "XIO-P2", "GPIO1", "U14_15", 2, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "XIO-P3", "GPIO2", "U14_16", 3, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "XIO-P4", "GPIO3", "U14_17", 4, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "XIO-P5", "GPIO4", "U14_18", 5, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "XIO-P6", "GPIO5", "U14_19", 6, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "XIO-P7", "GPIO6", "U14_20", 7, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED}, - { "GND", "GND", "U14_21", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "GND", "GND", "U14_22", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "AP-EINT1", "KPD-INT", "U14_23", 193, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "AP-EINT3", "AP-INT3", "U14_24", 35, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "TWI2-SDA", "I2C-SDA", "U14_25", 50, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "TWI2-SCK", "I2C-SCL", "U14_26", 49, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSIPCK", "SPI-SEL", "U14_27", 128, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSICK", "SPI-CLK", "U14_28", 129, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSIHSYNC", "SPI-MOSI", "U14_29", 130, BASE_METHOD_AS_IS, 1, -1, SPWM_DISABLED}, - { "CSIVSYNC", "SPI-MISO", "U14_30", 131, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSID0", "CSID0", "U14_31", 132, BASE_METHOD_AS_IS, 1, -1, SPWM_DISABLED}, - { "CSID1", "CSID1", "U14_32", 133, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSID2", "CSID2", "U14_33", 134, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSID3", "CSID3", "U14_34", 135, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSID4", "CSID4", "U14_35", 136, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSID5", "CSID5", "U14_36", 137, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSID6", "CSID6", "U14_37", 138, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "CSID7", "CSID7", "U14_38", 139, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "GND", "GND", "U14_39", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, - { "GND", "GND", "U14_40", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED}, + { "GND", "GND", "U13_1", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CHG-IN", "CHG-IN", "U13_2", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "VCC-5V", "VCC-5V", "U13_3", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "GND", "GND", "U13_4", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "VCC-3V3", "VCC-3V3", "U13_5", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "TS", "TS", "U13_6", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "VCC-1V8", "VCC-1V8", "U13_7", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "BAT", "BAT", "U13_8", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "TWI1-SDA", "KPD-I2C-SDA", "U13_9", 48, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "PWRON", "PWRON", "U13_10", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "TWI1-SCK", "KPD-I2C-SCL", "U13_11", 47, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "GND", "GND", "U13_12", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "X1", "X1", "U13_13", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "X2", "X2", "U13_14", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "Y1", "Y1", "U13_15", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "Y2", "Y2", "U13_16", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D2", "LCD-D2", "U13_17", 98, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "PWM0", "PWM0", "U13_18", 34, BASE_METHOD_AS_IS, 0, -1, BOTH}, + { "LCD-D4", "LCD-D4", "U13_19", 100, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D3", "LCD-D3", "U13_20", 99, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D6", "LCD-D6", "U13_21", 102, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D5", "LCD-D5", "U13_22", 101, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D10", "LCD-D10", "U13_23", 106, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D7", "LCD-D7", "U13_24", 103, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D12", "LCD-D12", "U13_25", 108, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D11", "LCD-D11", "U13_26", 107, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D14", "LCD-D14", "U13_27", 110, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D13", "LCD-D13", "U13_28", 109, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D18", "LCD-D18", "U13_29", 114, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D15", "LCD-D15", "U13_30", 111, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D20", "LCD-D20", "U13_31", 116, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D19", "LCD-D19", "U13_32", 115, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D22", "LCD-D22", "U13_33", 118, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D21", "LCD-D21", "U13_34", 117, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-CLK", "LCD-CLK", "U13_35", 120, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-D23", "LCD-D23", "U13_36", 119, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-VSYNC", "LCD-VSYNC", "U13_37", 123, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-HSYNC", "LCD-HSYNC", "U13_38", 122, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "GND", "GND", "U13_39", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LCD-DE", "LCD-DE", "U13_40", 121, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "GND", "GND", "U14_1", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "VCC-5V", "VCC-5V", "U14_2", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "UART1-TX", "UART-TX", "U14_3", 195, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "HPL", "HPL", "U14_4", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "UART1-RX", "UART-RX", "U14_5", 196, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "HPCOM", "HPCOM", "U14_6", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "FEL", "FEL", "U14_7", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "HPR", "HPR", "U14_8", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "VCC-3V3", "VCC-3V3", "U14_9", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "MICM", "MICM", "U14_10", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "LRADC", "ADC", "U14_11", -1, BASE_METHOD_AS_IS, -1, 0, BOTH}, + { "MICIN1", "MICIN1", "U14_12", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "XIO-P0", "XIO-P0", "U14_13", 0, BASE_METHOD_XIO, -1, -1, CHIP}, + { "XIO-P1", "XIO-P1", "U14_14", 1, BASE_METHOD_XIO, -1, -1, CHIP}, + { "XIO-P2", "GPIO1", "U14_15", 2, BASE_METHOD_XIO, -1, -1, CHIP}, + { "XIO-P3", "GPIO2", "U14_16", 3, BASE_METHOD_XIO, -1, -1, CHIP}, + { "XIO-P4", "GPIO3", "U14_17", 4, BASE_METHOD_XIO, -1, -1, CHIP}, + { "XIO-P5", "GPIO4", "U14_18", 5, BASE_METHOD_XIO, -1, -1, CHIP}, + { "XIO-P6", "GPIO5", "U14_19", 6, BASE_METHOD_XIO, -1, -1, CHIP}, + { "XIO-P7", "GPIO6", "U14_20", 7, BASE_METHOD_XIO, -1, -1, CHIP}, + { "GND", "GND", "U14_21", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "GND", "GND", "U14_22", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "AP-EINT1", "KPD-INT", "U14_23", 193, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "AP-EINT3", "AP-INT3", "U14_24", 35, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "TWI2-SDA", "I2C-SDA", "U14_25", 50, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "TWI2-SCK", "I2C-SCL", "U14_26", 49, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSIPCK", "SPI-SEL", "U14_27", 128, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSICK", "SPI-CLK", "U14_28", 129, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSIHSYNC", "SPI-MOSI", "U14_29", 130, BASE_METHOD_AS_IS, 1, -1, BOTH}, + { "CSIVSYNC", "SPI-MISO", "U14_30", 131, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSID0", "CSID0", "U14_31", 132, BASE_METHOD_AS_IS, 1, -1, BOTH}, + { "CSID1", "CSID1", "U14_32", 133, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSID2", "CSID2", "U14_33", 134, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSID3", "CSID3", "U14_34", 135, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSID4", "CSID4", "U14_35", 136, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSID5", "CSID5", "U14_36", 137, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSID6", "CSID6", "U14_37", 138, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "CSID7", "CSID7", "U14_38", 139, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "GND", "GND", "U14_39", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, + { "GND", "GND", "U14_40", -1, BASE_METHOD_AS_IS, -1, -1, BOTH}, { NULL, NULL, NULL, -1, 0, -1, -1, -1} }; - // CREDIT FOR THIS FUNCTION DUE TO HOWIE KATZ OF NTC AND STEVE FORD // THIS WILL FIND THE PROPER XIO BASE SYSFS NUMBER // PORTED TO C FORM HOWIE'S PYTHON CODE WITH THE HELP OF STEVE: @@ -397,6 +396,21 @@ int get_gpio_number(const char *key, int *gpio) return status; } +int compute_port_pin(const char *key, int *port, int *pin) +{ + int gpio; + int rtn; + + rtn = get_gpio_number(key, &gpio); + + // Method from: + //https://bbs.nextthing.co/t/chippy-gonzales-fast-gpio/14056/6?u=xtacocorex + *port = gpio / 32; + *pin = gpio % 32; + + return rtn; +} + int get_key(const char *input, char *key) { if (!copy_key_by_key(input, key)) { diff --git a/source/common.h b/source/common.h index aeee0ba..4aacd91 100644 --- a/source/common.h +++ b/source/common.h @@ -56,6 +56,7 @@ SOFTWARE. #define BCM 11 #define CHIP 0 #define CHIPPRO 1 +#define BOTH 2 // In the pins_t structure, the "base_method" field tells how // the "gpio" field should be interpreted. @@ -68,11 +69,12 @@ typedef struct pins_t { const char *name; const char *altname; /* alternate name as referenced on pocketchip pin header */ const char *key; + //const char *altkey; /* alternate key for chip pro */ int gpio; /* port number to use under /sys/class/gpio */ int base_method; /* modifier for port number; see BASE_METHOD_... */ int pwm_mux_mode; /* pwm pin */ int ain; /* analog pin */ - int spwm_allow; /* pin allowed for software pwm */ + int sbc_type; /* which sbc pin is allowed */ } pins_t; @@ -104,7 +106,6 @@ int get_key(const char *input, char *key); int get_pwm_key(const char *input, char *key); int get_adc_ain(const char *key, unsigned int *ain); int build_path(const char *partial_path, const char *prefix, char *full_path, size_t full_path_len); -int get_spi_bus_path_number(unsigned int spi); void dyn_int_array_set(dyn_int_array_t **in_array, int i, int val, int initial_val); int dyn_int_array_get(dyn_int_array_t **in_array, int i, int initial_val); void dyn_int_array_delete(dyn_int_array_t **in_array); @@ -112,3 +113,4 @@ void clear_error_msg(void); char *get_error_msg(void); void add_error_msg(char *msg); void toggle_debug(void); +int compute_port_pin(const char *key, int *port, int *pin); diff --git a/source/py_gpio.c b/source/py_gpio.c index 5d676a7..83e58aa 100644 --- a/source/py_gpio.c +++ b/source/py_gpio.c @@ -742,10 +742,6 @@ static PyObject *py_selftest(PyObject *self, PyObject *args) ASSRT(0 == build_path("/home", "ip", fp, sizeof(fp))); ASSRT(0 == build_path("/NOTFOUND", "ch", fp, sizeof(fp))); - printf("Testing get_spi_bus_path_number\n"); - ASSRT(2 == get_spi_bus_path_number(0)); /* doesn't really work on CHIP */ - ASSRT(2 == get_spi_bus_path_number(1)); /* doesn't really work on CHIP */ - printf("Testing error message buffer\n"); clear_error_msg(); ASSRT(0 == strlen(get_error_msg()));