1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-11-17 22:42:28 +02:00

tools/lib/atben.c: check if the 8:10 slot is available and fail if it isn't

- atben.c (MMC_PATH, AT86RF230_PATH, find_file, slot_in_use): check
  if the MMC or AT86RF230 kernel driver uses the 8:10 card slot and
  print a detailed error message if it is
- atben.c (atben_open): fail if the 8:10 card slot is busy
This commit is contained in:
Werner Almesberger 2011-07-05 07:47:56 -03:00
parent 17f7b66f7b
commit f535a80c56

View File

@ -16,6 +16,8 @@
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <dirent.h>
#include <fnmatch.h>
#include <sys/mman.h> #include <sys/mman.h>
#include "at86rf230.h" #include "at86rf230.h"
@ -38,6 +40,10 @@ enum {
}; };
#define MMC_PATH "/sys/bus/platform/drivers/jz4740-mmc"
#define AT86RF230_PATH "/sys/bus/spi/drivers/at86rf230"
#define SOC_BASE 0x10000000 #define SOC_BASE 0x10000000
#define REG(n) (*(volatile uint32_t *) (dsc->mem+(n))) #define REG(n) (*(volatile uint32_t *) (dsc->mem+(n)))
@ -184,10 +190,53 @@ static void atben_reset_rf(void *handle)
} }
static int find_file(const char *path, const char *pattern)
{
DIR *dir;
const struct dirent *de;
dir = opendir(path);
if (!dir)
return 0;
while ((de = readdir(dir)))
if (!fnmatch(pattern, de->d_name, 0))
break;
if (closedir(dir) < 0) {
perror("closedir");
exit(1);
}
return !!de;
}
static int slot_in_use(void)
{
if (find_file(MMC_PATH, "*.0")) {
fprintf(stderr,
"The 8:10 card slot is currently used by the MMC controller.\n"
"You can try to detach it with:\n"
"# echo jz4740-mmc.0 >/sys/bus/platform/drivers/jz4740-mmc/unbind\n");
return 1;
}
if (find_file(AT86RF230_PATH, "*.0")) {
fprintf(stderr,
"The 8:10 card slot is currently used by the AT86RF230 kernel driver.\n"
"You can try to detach it with:\n"
"# cd /sys/bus/spi/drivers/at86rf230\n"
"# echo spi*.0 >unbind\n");
return 1;
}
return 0;
}
static void *atben_open(const char *arg) static void *atben_open(const char *arg)
{ {
struct atben_dsc *dsc; struct atben_dsc *dsc;
if (slot_in_use())
return NULL;
dsc = malloc(sizeof(*dsc)); dsc = malloc(sizeof(*dsc));
if (!dsc) { if (!dsc) {
perror("malloc"); perror("malloc");