首页 > 其他分享 >C代码之GPIO

C代码之GPIO

时间:2023-04-25 11:11:05浏览次数:37  
标签:return int 代码 param fd gpio GPIO size

**
* @fn int gpio_is_exported(size_t gpio)
* @brief Test gpio is exported or not
* @param size_t gpio : The number of gpio
* @param
* @return Is exported:(0) ; Is not exported:(-1)
*/
int gpio_is_exported(size_t gpio)
{
int fd = 0;
char buf[64] = {0};
size_t len = 0;
int piobasenum;
piobasenum = gpio;
len = snprintf(buf, sizeof(buf), CFG_GPIO_DIR "/gpio%u/direction", piobasenum);

if(len < 0) {
return -1;
}

fd = open(buf, O_WRONLY);

if (fd >= 0) {
close(fd);
//OK, GPIO is exported
return 0;
}

return -1;
}

/**
* @fn int gpio_export(size_t gpio)
* @brief Export the gpio to operate.
* @param size_t gpio : The number of gpio
* @param
* @return Sucess:(0) ; Fail:(-1)
*/

int gpio_export(size_t gpio)
{
int fd = 0;
int i;
char buf[64] = {0};
size_t len = 0;

if( gpio_is_exported(gpio) == 0 ) {
return 0; //No need to re-export
}

fd = open(CFG_GPIO_DIR "/export", O_WRONLY);

if( fd < 0 ) {
return -1;
}

len = snprintf(buf, sizeof(buf), "%u", gpio);

if(len < 0) {
return -1;
}

write(fd, buf, len);
close(fd);

/* wait until file is actually available in user space */
for (i = 0; i < CFG_GPIO_SYS_FILE_EXPORTED_TIME_IN_100MS; i++) {
if( gpio_is_exported(gpio) == 0 ) {
return 0; //GPIO is present in user space
}

usleep(100 * 1000);
}

return -1;
}

/**
* @fn int gpio_unexport(size_t gpio)
* @brief Unexport the gpio .
* @param size_t gpio : The number of gpio
* @param
* @return Sucess:(0) ; Fail:(-1)
*/
int gpio_unexport(size_t gpio)
{
int fd = 0;
char buf[64] = {0};
size_t len = 0;
fd = open(CFG_GPIO_DIR "/unexport", O_WRONLY);

if( fd < 0 ) {
return -1;
}

len = snprintf(buf, sizeof(buf), "%u", gpio);

if( len < 0 ) {
return -1;
}

write(fd, buf, len);
close(fd);
return 0;
}

/**
* @fn int gpio_set_direction(size_t gpio, bool output)
* @brief Set direction of the gpio .
* @param size_t gpio : The number of gpio
* @param char output : 1 - output; 0 - input
* @return Sucess:(0) ; Fail:(-1)
*/

int gpio_set_direction(size_t gpio, char output)
{
int fd = 0;
char buf[64] = {0};
size_t len = 0;
int piobasenum;
piobasenum = gpio;
len = snprintf(buf, sizeof(buf), CFG_GPIO_DIR "/gpio%u/direction", piobasenum);

if( len < 0 ) {
return -1;
}

fd = open(buf, O_WRONLY);

if( fd < 0 ) {
return -1;
}

if(output) {
write(fd, "out", 3);
} else {
write(fd, "in", 2);
}

close(fd);
return 0;
}

 

/**
* @fn int gpio_open(size_t gpio, int mode)
* @brief open the gpio value file,prepare to operate.
* @param size_t gpio : The number of gpio
* @param int mode : O_NONBLOCK open or not
* @return Sucess:(0) ; Fail:(-1)
*/
int gpio_open(size_t gpio, int mode)
{
int fd = 0;
char buf[64] = {0};
size_t len = 0;
int piobasenum;
piobasenum = gpio;
len = snprintf(buf, sizeof(buf), CFG_GPIO_DIR "/gpio%u/value", piobasenum);

if( len < 0 ) {
return -1;
}

fd = open(buf, mode | O_NONBLOCK);

if( fd < 0 ) {
printf("gpio open fail \n");
return -1;
}

return fd;
}
/**
* @fn int gpio_close(int fd)
* @brief close the gpio value file.
* @param int fd : file handler of value
* @param
* @return Sucess:(0) ; Fail:(-1)
*/

int gpio_close(int fd)
{
return close(fd);
}

/**
* @fn int gpio_set_value(size_t gpio, int value)
* @brief Set the gpio value.
* @param size_t gpio : The number of gpio
* @param int value : value to set 1 - High; 0 - Low
* @return Sucess:(0) ; Fail:(-1)
*/

int gpio_set_value(size_t gpio, int value)
{
int fd;
int i;
char j;
fd = gpio_open(gpio, O_WRONLY);

if(fd == -1) {
printf("gpio open fail \n");
return -1;
}

if(!value) {
j = '0';
} else {
j = '1';
}

i = write(fd, &j, sizeof(char));
gpio_close(fd);

if ( i < 0 ) {
printf("gpio write fail \n");
return -1;
} else {
return 0;
}
}
/**
* @fn int gpio_get_value(size_t gpio, int value)
* @brief get the gpio value and return.
* @param size_t gpio : The number of gpio
* @param
* @return Sucess:(0/1) ; Fail:(-1)
*/

int gpio_get_value(size_t gpio)
{
int fd;
int i;
char value;
fd = gpio_open(gpio, O_RDONLY);

if(fd == -1) {
return -1;
}

i = read(fd, &value, sizeof(char));
gpio_close(fd);

if ( i < 0 ) {
return -1;
} else {
if (value == '1') {
i = 1;
} else {
i = 0;
}
}

return i;
}

/**
* @fn int gpio_register(size_t gpio, int mode)
* @brief registe the gpio according the mode.
* @param size_t gpio : The number of gpio
* @param int mode : input/output
* @return Sucess:(0) ; Fail:(-1)
*/

int gpio_register(size_t gpio, int mode)
{
int i;
i = gpio_export(gpio);

if (i) {
return -1; //export fail
}

switch (mode) {
case GPIO_MODE_INPUT:
i = gpio_set_direction(gpio, 0);
break;

case GPIO_MODE_OUTPUT:
i = gpio_set_direction(gpio, 1);
break;

default:
i = gpio_set_direction(gpio, 0);
}

return i; //-1: fail 0: success
}

/**
* @fn int gpio_unregister(size_t gpio)
* @brief unregiste the gpio .
* @param size_t gpio : The number of gpio
* @param
* @return Sucess:(0) ; Fail:(-1)
*/

int gpio_unregister(size_t gpio)
{
return gpio_unexport(gpio);
}

/**
* @fn int InitExIOState(void)
* @brief Initialize the GPIO state.
* @param
* @param
* @return Sucess:(==0) ; Fail:-1
*/

int InitExIOState(void)
{
int i;
int ret = 0;
int gpio_num;

for(i=0; i< (sizeof(DO_map)/2); i++) {
gpio_num = DO_map[i];
ret = gpio_register(gpio_num, GPIO_MODE_OUTPUT);

if(ret < 0) {
return -1;
}
}

for(i=0; i < (sizeof(DI_map)/2); i++) {
gpio_num = DI_map[i];
ret = gpio_register(gpio_num, GPIO_MODE_INPUT);

if(ret < 0) {
return -1;
}
}

return 0;
}

/**
* @fn int SetExIOOutState(int gpio, int state)
* @brief Set the GPIO output(level) and IO statement.
* @param int gpio : Port number of IO
* @param int state : Statement of IO(0:open/1:close)
* @return Sucess:(==0) ; Fail: else
*/
int SetExIOOutState(int gpio, int state)
{
int i;
i = gpio_set_value(gpio, state);
return i;
}


/**
* @fn int GetExIOInValue(int gpio,int *curval)
* @brief Read the statement of IO in input state.
* @param int gpio : Port number of IO
* @param int *curval : Current Statement of IO(0:Low/1:High)
* @return Sucess:(==0) ; Fail:(else)
*/
int GetExIOInValue(int gpio,int* curval)
{
int i;

i = gpio_get_value(gpio);

if(i<0) {
return i;
} else {
*curval = i;
return 0;
}
}

标签:return,int,代码,param,fd,gpio,GPIO,size
From: https://www.cnblogs.com/loongson-artc-lyc/p/17352033.html

相关文章

  • 登录接口实现细节分析与登录接口代码实现
    登录接口实现细节分析登陆接口接下我们需要自定义登陆接口,然后让SpringSecurity对这个接口放行,让用户访问这个接口的时候不用登录也能访问。​在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把Authe......
  • 淘宝API接口对接(商品详情,评论,按图搜图,订单列表)代码封装,可高并发
    淘宝OpenAPI(Openapplicationprogramminginterface)是一套REST方式的开放应用程序编程接口。淘宝网根据自己提供的电子商务基础服务,抽象并做成一系列的API接口。通过这些接口,可以让外部用户能够通过程序的方式访问淘宝网的数据和平台。淘宝OpenAPI是淘宝开放平台的重要组成......
  • 浏览器4行js代码自动读取IC卡号
    BS架构软件集成IC卡读卡器,在前段只需要4行js代码即可实现自动读取IC卡卡号,在web上使用IC卡读卡器其实就是这么简单.首先安装友我IC卡读卡器web插件,这个web插件安装后之后goole浏览器,火狐,IE等浏览器,然后插上IC卡读卡器YW-607HC,然后开始敲js代码了.引入相应的js后,开始寻卡......
  • 代码重构
    ......
  • 解决企业微信在线文档里的代码复制后不能执行的问题
    【问题】某日帮同事改了个SQL,自己能执行,因为懒得另存为,就直接丢到企业微信发了。企业微信提示因为超长生成了在线文档。同事复制后,执行一直报错,类似下面的情况:【报错】 【能执行】【原因】既然语法正确,那么就把文档下载下来瞅瞅。以下是WPS的检查方法,word检查方法类似。......
  • 【多臂赌机】基于时变egreedy策略结合强化学习求解多臂赌机问题附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 《代码大全》阅读笔记2
    二、编写高质量代码1.类软件的首要技术使命就是管理复杂度。可以通过把整个复杂系统分解为多个子系统降低问题的复杂度。关于封装:类很像是冰山,八分之七都在水面以下,你只能看到水面以上的八分之一。抽象数据类型(ADT)是指一些数据以及在这些数据上所能进行的操作的集合。考虑类......
  • Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型|附代
    原文链接:http://tecdat.cn/?p=27058最近我们被客户要求撰写关于因果推断与增量的研究报告,包括一些图形和统计输出。使用ML进行提升建模和因果推理Python包提供了一套使用基于最近研究的机器学习算法的提升建模和因果推理方法。允许用户根据实验或观察数据估计条件平均处理效......
  • R语言生态学进化树推断物种分化历史:分类单元数与时间关系、支系图可视化|附代码数据
    全文链接:http://tecdat.cn/?p=31434最近我们被客户要求撰写关于生态学进化树的研究报告,包括一些图形和统计输出。我们围绕进化树技术进行一些咨询,分析生物类群在时间上的多样性是如何变化的我们将用到分类单元数-时间图(Lineages-through-timeplot),该图可以用来描述物种多样化......
  • 贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据
    原文链接:http://tecdat.cn/?p=22702最近我们被客户要求撰写关于贝叶斯分位数回归的研究报告,包括一些图形和统计输出。贝叶斯回归分位数在最近的文献中受到广泛关注,本文实现了贝叶斯系数估计和回归分位数(RQ)中的变量选择,带有lasso和自适应lasso惩罚的贝叶斯摘要还包括总结结果、......