Подскажите учебный проект (для закрепления работы с kthread)
Всем привет.
Друзья помогите придумать, проект для тренировки работы с потоками ядра. Мне как новичку в голову вообще ничего не приходит, но жутко интересно)
Спасибо!
Всем привет.
Друзья помогите придумать, проект для тренировки работы с потоками ядра. Мне как новичку в голову вообще ничего не приходит, но жутко интересно)
Спасибо!
Хочу освоить системное программирование: написание драйверов на уровне ядра, системные задачи и тп, возможно сборка системы под железку на подобии ПЛИСового проца.
О себе разработчик на ПЛИС, но хорошо знаю Си тк много писал под контроллеры. Хочу переквалифицироваться на embedded программиста.
О деньгах договоримся. Нужно всего пару раз в неделю, просто наставничесво, объяснение тонких моментов и примеры кода.
8 999 528 06 01 Артём. soikadigital@gmail.com
Всем привет.
Подскажите пожалуйста, что я делаю не так.
Задача: передать массив данных в ПЛИС через PCIe и DMA.
Пока данные могу слать и читать с помощью ioread и iowrite, так же можно переслать через memcry, это говорит что девайс на pci жив и с ним можно работать, dma в пределах ПЛИСА так же отлично работает.
Вот теперь пытаюсь выделить кусок физической памяти в хосте, проинитеть его тестовыми данными (я просто решил её полностью заполнить константным значением), затем передать адрес этой памяти в pcie ПЛИСА и забрать от туда данные через dma (те pcie заберет по адресу данные, положит их к себе в выделенный бар (axi bar) и даст команду dma что можно забирать и складывать в ddr.
регистры ddr и pcie ПЛИСА так же пишутся, проверял. По всей видимости, косяк в коде.
Изначально область BAR0 (axi bar) со стороны ПЛИС обнулена, область для тестовых данных в DDR я тоже зануляю по включению питания. Когда шлю данные из хоста в BAR0 (axi bar) появляются странные, но достаточно не хаотичные цифры, но отличные от тех что шлю. Это говорит о том что что-то всётаки приходит из хоста.
Посмотрите пожалуйста код и подскажите что исправить.
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include "vi_cntr.h"
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Drakonof");
MODULE_DESCRIPTION("PCI");
MODULE_VERSION("0.1");
#define CDMA_BAR 0
#define PCI_BAR 1
#define DDR_BAR 2
#define DEVICE_NAME "drakonof_pci"
static dma_addr_t dma_handle = 0;
static void * dmabuf = NULL;
static volatile uint32_t *pci_reg_mem = NULL, *cdma_reg_mem = NULL;
static volatile uint32_t *ddr_mem = NULL;
static resource_size_t cdma_start,cdma_len,pci_start,pci_len,ddr_start,ddr_len;
static struct pci_device_id vi_cntr_pci_id[] = {
{ PCI_DEVICE(VI_CNTR_VENDOR, VI_CNTR_ID), },
{ 0, }
};
MODULE_DEVICE_TABLE(pci, vi_cntr_pci_id);
static int vi_cntr_probe(struct pci_dev *pDev, const struct pci_device_id *id);
static void vi_cntr_remove(struct pci_dev *pDev);
static struct pci_driver vi_cntr_pci = {
.name = DEVICE_NAME,
.id_table = vi_cntr_pci_id,
.probe = vi_cntr_probe,
.remove = vi_cntr_remove
};
static int __init pci_init(void)
{
struct pci_dev *p_pci_dev = NULL;
if((p_pci_dev = pci_get_device(VI_CNTR_VENDOR,VI_CNTR_ID, p_pci_dev)) == NULL)
{
printk(KERN_NOTICE "PCI device not finded\n");
}
return pci_register_driver(&vi_cntr_pci);
}
static void __exit pci_exit(void)
{
pci_unregister_driver(&vi_cntr_pci);
}
static int vi_cntr_probe(struct pci_dev *p_pci_dev, const struct pci_device_id *pId)
{
u16 vendor = 0,
id = 0;
u32 i = 0;
if(pci_enable_device(p_pci_dev))
{
printk(KERN_INFO "pci_enable_device error\n");
}
pci_read_config_word(p_pci_dev, PCI_VENDOR_ID, &vendor);
pci_read_config_word(p_pci_dev, PCI_DEVICE_ID, &id);
printk(KERN_INFO "\n----------------------------------\n");
printk(KERN_INFO "Device vendor: 0x%X\nDevice id: 0x%X\n", vendor, id);
cdma_start = pci_resource_start(p_pci_dev,CDMA_BAR);
cdma_len = pci_resource_len(p_pci_dev,CDMA_BAR);
pci_start = pci_resource_start(p_pci_dev,PCI_BAR);
pci_len = pci_resource_len(p_pci_dev,PCI_BAR);
ddr_start = pci_resource_start(p_pci_dev,DDR_BAR);
ddr_len = pci_resource_len(p_pci_dev,DDR_BAR);
if(pci_set_dma_mask(p_pci_dev, DMA_BIT_MASK(64)))
{
printk(KERN_INFO "pci_set_dma_mask error.\n");
return -1;
}
if((dmabuf=dma_alloc_coherent(&p_pci_dev->dev,8192,&dma_handle,GFP_USER)) == NULL)
{
printk(KERN_INFO "dma_alloc_coherent error.\n");
return -1;
}
if(pci_request_regions(p_pci_dev, DEVICE_NAME))
{
printk(KERN_INFO "pci_request_regions error.\n");
return -1;
}
pci_set_master(p_pci_dev);
if((cdma_reg_mem = ioremap(cdma_start,cdma_len)) == NULL)
{
printk(KERN_INFO "ioremap pci_reg_mem error.\n");
return -1;
}
if((pci_reg_mem = ioremap(pci_start,pci_len)) == NULL)
{
printk(KERN_INFO "ioremap pci_reg_mem error.\n");
return -1;
}
if((ddr_mem = ioremap(ddr_start,ddr_len)) == NULL)
{
printk(KERN_INFO "ioremap pci_reg_mem error.\n");
return -1;
}
// здесь я заполняю массив для передачи константой
dma_sync_single_for_cpu(&p_pci_dev->dev, dma_handle, 8192, DMA_TO_DEVICE);
for(i = 0; i < 256; i++)
{
*(u32*)(dmabuf + i)= 0xABCDEF89;
}
dma_sync_single_for_device(&p_pci_dev->dev, dma_handle, 8192, DMA_TO_DEVICE);
// передаю адрес выделенной физической памяти в pcie ПЛИСА
pci_reg_mem[0x208/4]=(dma_handle >> 32);
pci_reg_mem[0x20c/4]=(dma_handle & 0xFFFFFFFF);
// заполняю регистры cdma ПЛИС
cdma_reg_mem[0x18/4]=0x30000000; // из BAR0 (axi bar)
cdma_reg_mem[0x20/4]=0x80000000; // в ddr
// передать 256 байт, это так же запускает копирование
// данных из BAR0 (axi bar) в ddr
cdma_reg_mem[0x28/4]=256;
// жду статуса конца передачи от cdma
i = 0;
while(!(cdma_reg_mem[0x4/4] & 0x2))
{
if(i == 100000)
{
printk(KERN_INFO "SR ERR %X\n",cdma_reg_mem[0x4/4]);
break;
}
else i++;
}
iounmap(pci_reg_mem);
iounmap(cdma_reg_mem);
iounmap(ddr_mem);
pci_release_regions(p_pci_dev);
pci_disable_device(p_pci_dev);
dma_free_coherent(&p_pci_dev->dev, 8192, dmabuf, dma_handle);
return 0;
}
Спасибо!
Debian 10
Всем привет! Друзья подскажите почему printk не выводит в dmesg?
Вариант 1: что то с настройками системы.
Вариант 2: не вызываеться myPciDriverProbe из init функции, что уже хуже и более вероятно. Тогда от сюда следующий вопрос - почему myPciDriverProbe не вызывается, ведь pci_get_device находит устройсво?
pci_register_driver возвращает 0
Заранее спасибо.
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/pci.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Drakonof");
MODULE_DESCRIPTION("PCI");
MODULE_VERSION("0.1");
#define VENDOR 0x8086
#define ID 0x0150
static struct pci_device_id pciId[] = {
{ PCI_DEVICE(0x8086, 0x0150), },
{ 0, }
};
MODULE_DEVICE_TABLE(pci, pciId);
static int myPciDriverProbe(struct pci_dev *pDev, const struct pci_device_id *id);
static void myPciDriverRemove(struct pci_dev *pDev);
static struct pci_driver myDriver = {
.name = "my pci driver",
.id_table = pciId,
.probe = myPciDriverProbe,
.remove = myPciDriverRemove
};
static int __init myPciDriverInit(void)
{
struct pci_dev *pDev = NULL;
printk(KERN_NOTICE "Init PCI start\n" );
if((pDev = pci_get_device(VENDOR,ID, pDev)) != NULL)
{
printk(KERN_NOTICE "V:%X D:%X finded\n",pDev->vendor,pDev->device);
}
else
{
printk(KERN_NOTICE "PCI device not finded\n");
return -1;
}
printk(KERN_NOTICE "Init PCI stop\n" );
return pci_register_driver(&myDriver);
}
static void __exit myPciDriverExit(void)
{
pci_unregister_driver(&myDriver);
}
static int myPciDriverProbe(struct pci_dev *pDev, const struct pci_device_id *id)
{
u16 vendor, id;
pci_read_config_word(pDev, PCI_VENDOR_ID, &vendor);
pci_read_config_word(pDev, PCI_DEVICE_ID, &id);
printk(KERN_ERR "Device vid: 0x%X pid: 0x%X\n", vendor, id);
return 0;
}
static void myPciDriverRemove(struct pci_dev *pDev)
{
pci_release_region(pDev, pci_select_bars(pDev, IORESOURCE_MEM));
pci_disable_device(pDev);
}
module_init(myPciDriverInit);
module_exit(myPciDriverExit);
Всем привет!
Debian 9
Пытаюсь собрать либы для ubus и libubox. Все исходники качнул с openWRT, в составе которых есть дэфолтные CMakeLists.txt.
Поставил Lua 5.3. Папка ubus лежит в ворркспэйсе, рядом libubox.
Скажу сразу, что cmake я раньше не использовал.
cmake выдаёт ошибку CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Буду благодарен за любую помощь.
root@debian:~/workspace_codeBlocks/ubus# cmake .
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
blob_library
linked by target "ubusd" in directory/root/workspace_codeBlocks/ubus
linked by target "cli" in directory /root/workspace_codeBlocks/ubus
linked by target "server" in directory /root/workspace_codeBlocks/ubus/examples
json
linked by target "ubusd" in directory /root/workspace_codeBlocks/ubus
linked by target "cli" in directory /root/workspace_codeBlocks/ubus
linked by target "server" in directory /root/workspace_codeBlocks/ubus/examples
ubox_include_dir
used as include directory in directory
/root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus
used as include directory in directory
/root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus
used as include directory in directory /root/workspace_codeBlocks/ubus/lua
used as include directory in directory
/root/workspace_codeBlocks/ubus/lua
used as include directory in directory /root/workspace_codeBlocks/ubus/lua
used as include directory in directory /root/workspace_codeBlocks/ubus/lua
used as include directory in directory /root/workspace_codeBlocks/ubus/lua
used as include directory in directory /root/workspace_codeBlocks/ubus/lua
used as include directory in directory /root/workspace_codeBlocks/ubus/lua
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
used as include directory in directory /root/workspace_codeBlocks/ubus/examples
ubox_library
linked by target "ubus" in directory /root/workspace_codeBlocks/ubus
linked by target "ubusd" in directory /root/workspace_codeBlocks/ubus
linked by target "cli" in directory /root/workspace_codeBlocks/ubus
linked by target "server" in directory /root/workspace_codeBlocks/ubus/examples
linked by target "client" in directory /root/workspace_codeBlocks/ubus/examples
-- Configuring incomplete, errors occurred!
See also "/root/workspace_codeBlocks/ubus/CMakeFiles/CMakeOutput.log".
Всем привет. О себе: c/с++, stm32, TI. Хочу научиться писать под embeded linux, но без понятия с чего начать, какую выбрать целевую платформу (biglbone, raspberry или есть еще что то) и вообще embedded linux это дистрибутив или их семейство? В общем как видите, нужна помощь) Какие первые шаги нужно предпринять?
Спасибо.