LINUX.ORG.RU

История изменений

Исправление u5er, (текущая версия) :

Ты за кого меня принимаешь?!

За пользователя в сети.

Ну-ну, посмотрел бы я на твои инлайны. Хотя бы в простейшем случае - настройке портов

При настройке портов не вижу смысла упарываться, поэтому делаю всё процедуркой

static int sx1509ChipSetup( struct BicOS* os ){
	
	int i;
	int res;
	
	const unsigned char regData[][2] = {
		{ SX1509_REG_RESET,                0x12  },//soft reset - step 1
		{ SX1509_REG_RESET,                0x34  },//soft reset - step 2
		{ SX1509_REG_DIR_B,                0xff  },//all input
		{ SX1509_REG_DIR_A,                0x00  },//all output
		{ SX1509_REG_OPEN_DRAIN_A,         0xef  },//all open-drain, кроме 4
		{ SX1509_REG_PULLUP_B,             0xff  },//all pull-up
		{ SX1509_REG_DEBOUNCE_ENABLE_B,    0xff  },//all enable
		{ SX1509_REG_DEBOUNCE_CONFIG,      0x04  },//8ms
		{ SX1509_REG_KEY_CONFIG_1,         0x65  },//32ms, 4s autosleep
		{ SX1509_REG_KEY_CONFIG_2,         0x1c  },//4rows, 5 columns
		{ SX1509_REG_CLOCK,                0x40  },//clock enable (internal 2MHz)
		{ SX1509_REG_INPUT_DISABLE_A,     (1<<4) },//disable input buffer on gpio 4
		{ SX1509_REG_MISC,                 0x10  },//LED driver frequency 7.56 KHz
		{ SX1509_REG_LED_DRIVER_ENABLE_A, (1<<4) },//enable 4 gpio LED
		{ LIST_TERMINATOR,                 0x00  }
	};
	
	for( i = 0; regData[i][0] != LIST_TERMINATOR; i++ ){
		res = i2c_master_transmit( os->sx1509_keys, regData[i], 2, SX1509_TIMEOUT_MS );
		if( res ) return -1;
	}
	
	return 0;
}

Исходная версия u5er, :

Ты за кого меня принимаешь?!

За пользователя в сети.

Ну-ну, посмотрел бы я на твои инлайны. Хотя бы в простейшем случае - настройке портов

При настройке портов не вижу смысла упарываться, поэтому делаю всё регуляркой

static int sx1509ChipSetup( struct BicOS* os ){
	
	int i;
	int res;
	
	const unsigned char regData[][2] = {
		{ SX1509_REG_RESET,                0x12  },//soft reset - step 1
		{ SX1509_REG_RESET,                0x34  },//soft reset - step 2
		{ SX1509_REG_DIR_B,                0xff  },//all input
		{ SX1509_REG_DIR_A,                0x00  },//all output
		{ SX1509_REG_OPEN_DRAIN_A,         0xef  },//all open-drain, кроме 4
		{ SX1509_REG_PULLUP_B,             0xff  },//all pull-up
		{ SX1509_REG_DEBOUNCE_ENABLE_B,    0xff  },//all enable
		{ SX1509_REG_DEBOUNCE_CONFIG,      0x04  },//8ms
		{ SX1509_REG_KEY_CONFIG_1,         0x65  },//32ms, 4s autosleep
		{ SX1509_REG_KEY_CONFIG_2,         0x1c  },//4rows, 5 columns
		{ SX1509_REG_CLOCK,                0x40  },//clock enable (internal 2MHz)
		{ SX1509_REG_INPUT_DISABLE_A,     (1<<4) },//disable input buffer on gpio 4
		{ SX1509_REG_MISC,                 0x10  },//LED driver frequency 7.56 KHz
		{ SX1509_REG_LED_DRIVER_ENABLE_A, (1<<4) },//enable 4 gpio LED
		{ LIST_TERMINATOR,                 0x00  }
	};
	
	for( i = 0; regData[i][0] != LIST_TERMINATOR; i++ ){
		res = i2c_master_transmit( os->sx1509_keys, regData[i], 2, SX1509_TIMEOUT_MS );
		if( res ) return -1;
	}
	
	return 0;
}