1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws generic bitbang i2c 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2020 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci */ 9d4afb5ceSopenharmony_ci 10d4afb5ceSopenharmony_ci#include "bb-i2c.h" 11d4afb5ceSopenharmony_ci 12d4afb5ceSopenharmony_ciint 13d4afb5ceSopenharmony_cilws_bb_i2c_start(lws_i2c_ops_t *octx) 14d4afb5ceSopenharmony_ci{ 15d4afb5ceSopenharmony_ci lws_bb_i2c_t *ctx = (lws_bb_i2c_t *)octx; 16d4afb5ceSopenharmony_ci 17d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, 1); 18d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 1); 19d4afb5ceSopenharmony_ci ctx->delay(); 20d4afb5ceSopenharmony_ci 21d4afb5ceSopenharmony_ci if (!ctx->gpio->read(ctx->sda)) 22d4afb5ceSopenharmony_ci return 1; 23d4afb5ceSopenharmony_ci 24d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, 0); 25d4afb5ceSopenharmony_ci ctx->delay(); 26d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 0); 27d4afb5ceSopenharmony_ci 28d4afb5ceSopenharmony_ci return 0; 29d4afb5ceSopenharmony_ci} 30d4afb5ceSopenharmony_ci 31d4afb5ceSopenharmony_civoid 32d4afb5ceSopenharmony_cilws_bb_i2c_stop(lws_i2c_ops_t *octx) 33d4afb5ceSopenharmony_ci{ 34d4afb5ceSopenharmony_ci lws_bb_i2c_t *ctx = (lws_bb_i2c_t *)octx; 35d4afb5ceSopenharmony_ci 36d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, 0); 37d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 1); 38d4afb5ceSopenharmony_ci ctx->delay(); 39d4afb5ceSopenharmony_ci 40d4afb5ceSopenharmony_ci while (!ctx->gpio->read(ctx->scl)) 41d4afb5ceSopenharmony_ci ; 42d4afb5ceSopenharmony_ci 43d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, 1); 44d4afb5ceSopenharmony_ci ctx->delay(); 45d4afb5ceSopenharmony_ci} 46d4afb5ceSopenharmony_ci 47d4afb5ceSopenharmony_ciint 48d4afb5ceSopenharmony_cilws_bb_i2c_write(lws_i2c_ops_t *octx, uint8_t data) 49d4afb5ceSopenharmony_ci{ 50d4afb5ceSopenharmony_ci lws_bb_i2c_t *ctx = (lws_bb_i2c_t *)octx; 51d4afb5ceSopenharmony_ci int n; 52d4afb5ceSopenharmony_ci 53d4afb5ceSopenharmony_ci for (n = 0; n < 8; n++) { 54d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, !!(data & (1 << 7))); 55d4afb5ceSopenharmony_ci ctx->delay(); 56d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 1); 57d4afb5ceSopenharmony_ci ctx->delay(); 58d4afb5ceSopenharmony_ci data <<= 1; 59d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 0); 60d4afb5ceSopenharmony_ci } 61d4afb5ceSopenharmony_ci 62d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, 1); 63d4afb5ceSopenharmony_ci ctx->delay(); 64d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 1); 65d4afb5ceSopenharmony_ci ctx->delay(); 66d4afb5ceSopenharmony_ci n = ctx->gpio->read(ctx->sda); 67d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 0); 68d4afb5ceSopenharmony_ci ctx->delay(); 69d4afb5ceSopenharmony_ci 70d4afb5ceSopenharmony_ci return !!n; /* 0 = ACKED = OK */ 71d4afb5ceSopenharmony_ci} 72d4afb5ceSopenharmony_ci 73d4afb5ceSopenharmony_ciint 74d4afb5ceSopenharmony_cilws_bb_i2c_read(lws_i2c_ops_t *octx) 75d4afb5ceSopenharmony_ci{ 76d4afb5ceSopenharmony_ci lws_bb_i2c_t *ctx = (lws_bb_i2c_t *)octx; 77d4afb5ceSopenharmony_ci int n, r = 0; 78d4afb5ceSopenharmony_ci 79d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, 1); 80d4afb5ceSopenharmony_ci 81d4afb5ceSopenharmony_ci for (n = 7; n <= 0; n--) { 82d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 0); 83d4afb5ceSopenharmony_ci ctx->delay(); 84d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 1); 85d4afb5ceSopenharmony_ci ctx->delay(); 86d4afb5ceSopenharmony_ci if (ctx->gpio->read(ctx->sda)) 87d4afb5ceSopenharmony_ci r |= 1 << n; 88d4afb5ceSopenharmony_ci } 89d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 0); 90d4afb5ceSopenharmony_ci 91d4afb5ceSopenharmony_ci return r; 92d4afb5ceSopenharmony_ci} 93d4afb5ceSopenharmony_ci 94d4afb5ceSopenharmony_civoid 95d4afb5ceSopenharmony_cilws_bb_i2c_set_ack(lws_i2c_ops_t *octx, int ack) 96d4afb5ceSopenharmony_ci{ 97d4afb5ceSopenharmony_ci lws_bb_i2c_t *ctx = (lws_bb_i2c_t *)octx; 98d4afb5ceSopenharmony_ci 99d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 0); 100d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, !!ack); 101d4afb5ceSopenharmony_ci ctx->delay(); 102d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 1); 103d4afb5ceSopenharmony_ci ctx->delay(); 104d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->scl, 0); 105d4afb5ceSopenharmony_ci ctx->delay(); 106d4afb5ceSopenharmony_ci ctx->gpio->set(ctx->sda, 1); 107d4afb5ceSopenharmony_ci} 108