Ovladač CAN není nic jiného než pojmenovaná entita, která podporuje základní I/O funkce – čtení, zápis, získání konfigurace a nastavení konfigurace. Ovladač zařízení používá a spravuje přerušení ze zařízení. Zatímco rozhraní je obecné a nezávislé na ovladači zařízení, skutečná implementace ovladače je zcela na návrháři ovladače zařízení.

To znamená, že důvodem pro použití ovladače zařízení je poskytnout přístup k zařízení CAN z kódu aplikace tak obecným a rozumným způsobem. Většina autorů ovladačů se také zabývá tím, aby tento přístup byl co nejjednodušší a zároveň co nejefektivnější.

Stejně jako ostatní ovladače zařízení se ovladač zařízení CAN zabývá pohybem informací – zprávami CAN. Pro co nejefektivnější využití systémových prostředků se používají přerušení. To umožní, aby v průběhu datových přenosů probíhalo další zpracování aplikací, s přerušeními používanými k indikaci různých událostí. Zařízení CAN například obvykle generuje přerušení poté, co byla odeslána zpráva CAN nebo byla přijata zpráva CAN hardwarovou vyrovnávací pamětí zpráv CAN. Během odesílání dat má smysl povolit další zpracování aplikací, protože to může trvat poměrně dlouho. Přerušení lze použít k tomu, aby řidič mohl odeslat zprávu CAN, jakmile je aktuální zpráva dokončena, bez aktivní účasti kódu aplikace.

Hlavní stavební bloky pro ovladače zařízení CAN se nacházejí v souborech include a

Stejně jako mnoho jiných ovladačů zařízení v eCos jsou ovladače zařízení CAN popsány záznamem tabulky zařízení s použitím typu cyg_devtab_entry_t. Položka by měla být vytvořena pomocí makra DEVTAB_ENTRY().

Standardní ovladač CAN dodávaný s eCos je strukturován jako hardwarově nezávislá část a hardwarově závislý modul rozhraní. Chcete-li přidat podporu pro nové zařízení CAN, uživatel by měl mít možnost používat stávající část nezávislou na hardwaru a pouze přidat svůj vlastní ovladač rozhraní, který zpracovává podrobnosti o skutečném zařízení. Uživatel by neměl mít potřebu měnit hardwarově nezávislou část.

Rozhraní používaná ovladačem CAN a implementačními moduly CAN jsou obsažena v souboru.

Položka DevTab

Modul rozhraní obsahuje položku devtab (nebo položky, pokud jeden modul podporuje více než jedno rozhraní). Tento záznam by měl mít tvar:

Štítek «C» pro tuto položku devtab

ČTĚTE VÍCE
Jak přeprogramuji klíčenku Jaguar?

Řetězec «C» pro zařízení. Např. /dev/can0.

Tabulka I/O funkcí. Tato sada je definována v hardwarově nezávislém CAN ovladači a měla by být použita.

Funkce inicializace hardwarového modulu.

Funkce vyhledávání zařízení. Tato funkce obvykle nastavuje zařízení CAN pro skutečné použití, zapíná přerušení, konfiguruje vyrovnávací paměti zpráv atd.

Tato tabulka (definovaná níže) obsahuje rozhraní mezi modulem rozhraní a vlastním ovladačem CAN.

Příklad záznamu devtab pro ovladač zařízení Motorola FlexCAN:

Struktura kanálu CAN

Každé zařízení CAN musí mít „kanál CAN“. Jedná se o soubor dat, který popisuje všechny operace na zařízení. Obsahuje také vyrovnávací paměti atd. Kanál CAN je vytvořen makrem:

CAN_CHANNEL_USING_INTERRUPTS(l, funs, dev_priv, baud, out_buf, out_buflen, in_buf, in_buflen)

Označení «C» pro tuto strukturu.

Sada funkcí rozhraní (viz níže).

Zástupný symbol pro jakákoli data specifická pro zařízení pro tento kanál.

Počáteční hodnota přenosové rychlosti ( cyg_can_baud_rate_t ).

Ukazatel na výstupní vyrovnávací paměť

Délka výstupní vyrovnávací paměti.

ukazatel na vstupní vyrovnávací paměť.

Délka vstupní vyrovnávací paměti.

Příklad implementace kanálu CAN pro ovladač zařízení Motorola FlexCAN:

CAN_CHANNEL_USING_INTERRUPTS( flexcan_can0_chan, flexcan_lowlevel_funs, flexcan_can0_info, CYG_CAN_BAUD_RATE(CYGNUM_DEVS_CAN_MCF52xx_FLEXCAN0_KBAUD), flexcan_can0_tg52ANxDEVxbux,FCF0ANxbux SIZE_TX, flexcan_can0_rxbuf, CYGNUM_DEVS_CAN_MCF52xx_FLEXCAN0_QUEUESIZE_RX);

Rozhraní z hardwarově nezávislého ovladače do modulu hardwarového rozhraní je obsaženo v tabulce funs. To je definováno makrem:

Struktura nízkoúrovňových funkcí CAN

CAN_LOWLEVEL_FUNS(l, putmsg, getevent, get_config, set_config, start_xmit, stop_xmit)

Označení «C» pro tuto strukturu.

bool (*putmsg)(can_channel *priv, cyg_can_message *pmsg, void *pdata)

Tato funkce odešle do rozhraní jednu CAN zprávu. Pokud je zpráva skutečně spotřebována, měla by vrátit hodnotu true. Pokud v rozhraní není místo, měla by vrátit hodnotu false

bool (*getevent)(can_channel *priv, cyg_can_event *pevent, void *pdata)

Tato funkce načte jednu událost z rozhraní.

Cyg_ErrNo (*get_config)(can_channel *priv, klíč cyg_uint32, const void *xbuf, cyg_uint32 *len)

Tato funkce se používá k dotazování na konfiguraci kanálu CAN.

Cyg_ErrNo (*set_config)(can_channel *priv, klíč cyg_uint32, const void *xbuf, cyg_uint32 *len)

Tato funkce se používá ke změně konfigurace kanálu CAN.

void (*start_xmit)(can_channel *priv)

Povolte přenosový kanál a zapněte přerušení přenosu.

void (*stop_xmit)(can_channel *priv)

Zakažte přenosový kanál a vypněte přerušení přenosu.

ČTĚTE VÍCE
Jak dlouho vydrží opravdu dobré pneumatiky?

Příklad implementace nízkoúrovňové funkční struktury pro ovladač zařízení Motorola FlexCAN:

CAN_LOWLEVEL_FUNS(flexcan_lowlevel_funs, flexcan_putmsg, flexcan_getevent, flexcan_get_config, flexcan_set_config, flexcan_start_xmit, flexcan_stop_xmit );

Zpětná volání

Modul rozhraní zařízení může provádět funkce v hardwarově nezávislém ovladači prostřednictvím chan->callbacks. K dispozici jsou tyto funkce:

void (*can_init)(can_channel *chan)

Tato funkce se používá k inicializaci kanálu CAN.

void (*xmt_msg)(can_channel *chan, void *pdata)

Tato funkce by byla volána z obsluhy přerušení po přerušení vysílání indikujícím, že mohou být odeslány další zprávy. Horní ovladač zavolá funkci putmsg podle potřeby pro odeslání více dat do zařízení.

void (*rcv_event)(can_channel *chan, void *pdata)

Tato funkce se používá k informování řidiče, že na rozhraní dorazila zpráva nebo že došlo k události. Tato funkce je obvykle volána z obsluhy přerušení.

Předch Domů další
Konfigurace Up Podpora ADC