PiScope (Raspberry Pi baserat oscilloskop) (6 / 10 steg)

Steg 6: Skriva kärnmodulen

Skapa en C-fil som heter Scope-drv.c som innehåller följande kod

#include < linux/kernel.h >
#include < linux/module.h >
#include < linux/fs.h >
#include < asm/uaccess.h >
#include < linux/time.h >
#include < linux/io.h >
#include < linux/vmalloc.h >

int init_module(void);
void cleanup_module(void);
static int device_open (struct inode *, struct fil *);
static int device_release (struct inode *, struct fil *);
statisk ssize_t device_read (struct fil *, char *, size_t, loff_t *);
statisk ssize_t device_write (struct fil *, const char *, size_t, loff_t *);

#define framgång 0
#define hårddisknamn "chardev"
#define BUF_LEN 80

/ * inställningen och makron för GPIO anslutningarna * /
#define BCM2708_PERI_BASE 0x20000000
#define GPIO_BASE (BCM2708_PERI_BASE + 0x20000000)

#define INP_GPIO(g) * (gpio.addr + ((g) / 10)) & = ~ (7 << (((g) % 10) * 3))
#define SET_GPIO_ALT(g,a) * (gpio.addr + (((g) / 10))) | = (((a) < = 3? () en) + 4:(a)==4?3:2) << (((g) % 10) * 3))

/ * GPIO klocka * /
#define CLOCK_BASE (BCM2708_PERI_BASE + 0x00101000)
#define GZ_CLK_BUSY (1 << 7)

/ * Antal prover att fånga * /
#define SAMPLE_SIZE 10000

/ * Definiera GPIO stift * /
/ * ADC 1 * /
#define BIT0_PIN 7
#define BIT1_PIN 8
#define BIT2_PIN 9
#define BIT3_PIN 10
#define BIT4_PIN 11
#define BIT5_PIN 25

/ * ADC 2 * /
#define BIT0_PIN2 17
#define BIT1_PIN2 18
#define BIT2_PIN2 22
#define BIT3_PIN2 23
#define BIT4_PIN2 24
#define BIT5_PIN2 27

struct bcm2835_peripheral {
osignerade långa addr_p;
int mem_fd;
void * karta;
volatile unsigned int * addr;

};

static int map_peripheral (struct bcm2835_peripheral * p);
statisk void unmap_peripheral (struct bcm2835_peripheral * p);
statisk void readScope(void);

statisk int Major;
statisk int Device_Open = 0;
statiska char msg [BUF_LEN];
statiska char * msg_Ptr;

statiska unsigned char * buf_p;

statiska struct file_operations fops = {
.read = device_read,
.Write = device_write,
.Open = device_open,
.release = device_release
};

statiska struct bcm2835_peripheral myclock = {CLOCK_BASE};
statiska struct bcm2835_peripheral gpio = {GPIO_BASE};
struct DataStruct {
uint32_t buffert [SAMPLE_SIZE];
uint32_t tid.
};

struct DataStruct dataStruct;

statiska unsigned char * ScopeBufferStart;
statiska unsigned char * ScopeBufferStop;

static int map_peripheral (struct bcm2835_peripheral * p) {
p -> addr =(uint32_t *) ioremap (GPIO_BASE, 41 * 4);
Return 0;
}

statisk void unmap_peripheral (struct bcm2835_peripheral * p) {
iounmap (p -> addr).
}

statisk void readScope() {
int counter = 0;
struct timespec ts_start, ts_stop;

local_irq_disable();
local_fiq_disable();

getnstimeofday(&ts_start);

While(Counter<SAMPLE_SIZE) {
dataStruct.Buffer[counter++]= * (gpio.addr + 13);
}
getnstimeofday(&ts_stop);

local_fiq_enable();
local_irq_enable();

dataStruct.time = timespec_to_ns (och ts_stop) - timespec_to_ns (& ts_start);

buf_p = (unsigned char *) & dataStruct;
ScopeBufferStart = (unsigned char *) & dataStruct;
ScopeBufferStop = ScopeBufferStart + sizeof (struct DataStruct);
}

int init_module(void) {
struct bcm2835_peripheral * p = & myclock;
int speed_id = 6;

Stora = register_chrdev (0, enhetsnamn, & fops);
om (Major < 0) {
printk (KERN_ALERT "Reg. char dev misslyckas %d\n",Major);
returnera Major;
}
printk (KERN_INFO "Stora antal %d.\n", Major);
printk (KERN_INFO "skapat en dev filen with\n");
printk (KERN_INFO "" mknod /dev/%s c %d 0'. \n ", enhetsnamn, Major);

om (map_peripheral(&gpio) == -1) {
printk (KERN_ALERT "Kunde inte mappa GPIO\n");
återvända -1;
}

INP_GPIO(BIT0_PIN);
INP_GPIO(BIT1_PIN);
INP_GPIO(BIT2_PIN);
INP_GPIO(BIT3_PIN);
INP_GPIO(BIT4_PIN);
INP_GPIO(BIT5_PIN);

INP_GPIO(BIT0_PIN2);
INP_GPIO(BIT1_PIN2);
INP_GPIO(BIT2_PIN2);
INP_GPIO(BIT3_PIN2);
INP_GPIO(BIT4_PIN2);
INP_GPIO(BIT5_PIN2);

/ * ställa in klocksignal till stift 4 * /
p -> addr =(uint32_t *) ioremap (CLOCK_BASE, 41 * 4);

INP_GPIO(4);
SET_GPIO_ALT(4,0);
*(myclock.addr+28)=0x5A000000 | speed_id;

While(*(myclock.addr+28) & GZ_CLK_BUSY) {};

*(myclock.addr+29)= 0x5A000000 | (0x32 << 12) | 0;

*(myclock.addr+28)=0x5A000000 | speed_id;

returnera framgång;
}

void cleanup_module(void) {
unregister_chrdev (Major, enhetsnamn);
unmap_peripheral(&gpio);
unmap_peripheral(&myclock);
}

static int device_open (struct inode * inode, struct fil * fil) {
statisk int counter = 0;
IF(Device_Open) återvända - EBUSY;
Device_Open ++;
sprintf (msg, "Called device_open %d times\n", counter ++);
msg_Ptr = msg;
readScope();
try_module_get(THIS_MODULE);
returnera framgång;
}

static int device_release (struct inode * inode, struct fil * fil) {
Device_Open--;
module_put(THIS_MODULE);
Return 0;
}

statisk ssize_t device_read (struct fil * filp, char * buffert, size_t längd, loff_t * offset) {
int bytes_read = 0;
om (* msg_Ptr == 0) return 0;

medan (längd & & buf_p < ScopeBufferStop) {
IF(0!=put_user(*(buf_p++), buffert ++))
printk (KERN_INFO "Problemet med kopiera\n");
längd--;
bytes_read ++;
}
återvända bytes_read;
}

statisk ssize_t device_write (struct fil * filp, const char * buff, size_t len, loff_t * off) {
printk (KERN_ALERT "den här åtgärden stöds inte. \n");
återvända - EINVAL;
}

Programmet innehåller några viktiga funktioner. För att en kernel modul fungerar. modulen behöver vissa särskilda posten funktioner. En av dessa fungerar är init_module(), som kallas när kärnmodulen är laddad. Funktionen device_open() anropas när enhetsfilen associeras med kärnmodulen öppnas. Öppna enhetsfilen orsakar ADC läsas ut 10 000 gånger, där resultaten sparas i minnet. Funktionen device_release() anropas när enheten stängs. Funktionen device_read() anropas när en process läser från enhetsfilen. Den här funktionen returnerar de mätningar som gjordes när enhetsfilen öppnades. Den senaste funktionen device_write() behövs för att hantera fallet när en process försöker skriva till den enheten.

Mer om kärna modul: http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html

Hela programmet är ansluten, kan du ladda upp den med hjälp av FileZilla.

Se Steg
Relaterade Ämnen

PiMSO - en Raspberry Pi baserat trådlöst oscilloskop

PiMSO, är en Raspberry Pi kontrollerad 200 Msa/S blandad signal oscilloskop. Beroende på programmet, kan man konfigurerar för användning Midori webbläsaren på Pi GUI eller tillgång distans via internet. Eftersom PiMSO GUI är webbaserade, kan du också...

Digilent ZYBO baserat oscilloskop med LabVIEW

Detta är enkel "oscilloskop" med Zynq - 7000 och NI LabVIEW program. Jag har använt inbyggda 12 - bitars analog till digital omvandlare 1MSPS för att få data från externa generator.För att generera signaler jag har använt DAC produktionen av STM...

Raspberry Pi baserat trådlös FM-mikrofon

En trådlös mikrofon är en mikrofon utan en fysisk kabel ansluts direkt till ljud inspelning eller komplettera utrustning som den hör samman. Kallas även en radiomikrofon, den har en liten, batteridriven radiosändare i mikrofonen förkroppsligar, som s...

3D tryckt PI-Scope Lab verktyg

Publicerad av Element14 det är en mycket intressant Ben Heck episod, modding dessa tre enheter för att skapa ett oscilloskop. Det är min uppfattning att denna föreslagna version har vissa begränsningar, så jag har sökt på hur man kan utveckla en enhe...

Oscilloskop klockan

en åtta stift Microchip PIC mikrokontroller är programmerad att fungera från en 32768 Hz klocka kristall och utdata vågformer som, när de visas i ett oscilloskop, Visa tiden i hh format. Skärmen ta till fånga visar winscope visar 12:46:...Steg 1: Des...

Raspberry Pi sällskapsdjur Monitor

Detta Instructable guidar dig genom installationen av en (oftast) headless Raspberry Pi baserat sällskapsdjur bildskärm. Denna sällskapsdjur monitor varnar dig när ditt husdjur blir högljudd genom att skicka ett meddelande om Pushbullet. Också, om du...

Raspberry Pi färgade Server fall Mod

Syftet med denna mod är att skapa ett ärende för Raspberry Pi, baserat på Adafruits fall skapad av Mike Doell. Det har en bättre luftflöde och vara lätta att identifiera genom färg.För detta projekt behöver du:KylflänsKylfläns föreningMike Doell fall...

Raspberry Pi baserade RFID Music Robot

Ett par veckor sedan, såg jag den här riktigt cool Raspberry Pi baserade RFID-baserade kassettbandspelare. Det sprang PiMusicbox och tillverkare skapade en modul till kontroll PiMusicbox via RFID. Detta skulle vara perfekt för min tre år gamla dotter...

RetroFamipie - Famicom baserat Retropie

Detta är ännu en annan falländring för en raspberry pi baserat RetroPie.I detta skede meddelanden jag endast bilder och hög nivå beskrivningar av stegen.Du välkommen att ställa frågor eller Detaljer om arbetetSteg 1: Rengöring och förbereda fallet 3...

Installera Bluetooth USB-Radio maskinvara i Linux System

IntroduktionDetta instructable är baserat på min erfarenhet du har installerat Bluetooth i en anteckningsbok och Raspberry Pi.Target läsareDetta instructable kommer mestadels fördel Linux förbrukaren, särskilt Debian och dess deriviatives som Raspber...

En billig fotometer och kolorimeter

Version 08-maj-2016Vad är detta instructable om?Syftet med detta projekt var att bygga en enkel och billig enhet som tillåter mätning av färg sammansättningen av en lösning, dvs en kolorimeter och/eller dess optiska densitet, dvs en fotometer.Det är...

Att införa Climaduino - Arduino-baserad termostaten du styr från din telefon!

Uppdatering:Det finns en ny version av Climaduino och Climaduino Controller med några mycket väsentliga ändringar.Stöder flera zonerAnvänder Arduino YúnFungerar med Central luftkonditioneringKommunicerar med MQTT protokoll (kan integrera med andra sy...

OSMC och TV kontrolleras av Flic smarta knappen

Detta projekt utgår från ett specifikt behov, simplfy några upprepade åtgärder.Jag har fått OSMC mediacenter Raspberry Pi baserat som jag använder varje kväll när jag vill titta på en dokumentär på min gamla plasma-TV (utan HDMI) innan sömn.De åtgärd...

HACCSY - Hackerspace åtkomstkontroll och checka in System

HACCSY abreviation står för Hackerspace Access Control och checka in System och det är ganska mycket vad den gör.HACCSY app är tänkt att köra på en RaspberryPi som är ansluten till internet och elektriska strike låsa ytterdörren. Det gör jobbet enkel...

DIY billiga handske controller och propeller bil

Hej duI detta instructable jag ska visa dig hur man gör de billigaste handsken för att styra din robotar eller andra Arduino eller raspberry pi baserat projekt och till demonstration exempel jag ska även hur en liten tutorial hur jag gjorde bilen kon...

Modulära Multiport USB förmåga tillförsel

Detta modulära nätaggregat kan leverera från 9 till 54 USB portar 5VDC makt. Varje modul innehåller 9 portar och totalt upp till 10 ampere.Det började som en tillgång för en Raspberry Pi baserat nätverk utbildning Lab för Hurricane Electric. (Kontakt...

Aquarium LED Light Controller baserat på Raspberry Pi

Att ha ett akvarium är bra för en hobby och för ett yrke.En av de viktigaste komponenterna i ett akvarium är ordentlig belysningssystemet (bland andra).Det finns mycket litteratur på internet om detta tema, från de mycket grundläggande på timer switc...

Hem (rum) Temprature och luftfuktighet Monitor med webb-baserat diagram - Raspberry Pi

Enkelt sätt att övervaka din, hem, rum, garage liten fabrik eller någon annan förlägger temperatur och luftfuktighet från var som helst i världen via internet.Det mycket roligt och mycket enkel.Steg 1: Konceptet Raspberry Pi får den Home(Room) temper...

PWM baserat LED kontroll med hjälp av tryckknappar, Raspberry Pi 2 och Scratch

Jag försökte hitta ett sätt att förklara hur PWM arbetat för mina studenter så jag satte mig i uppgift att försöka kontrollera ljusstyrkan i en LED använder 2 tryckknappar - en knapp öka ljusstyrkan i en LED och den andra ljusreglering det. För att p...