Tag: embedded linux

怀疑linux中的container_of宏

为什么我们使用container_of宏? container_of(pointer, container_type, container_field); 据LDD说 “这个宏在一个类型为container_field的结构中接受一个名为container_field的字段的指针,并返回一个指向包含结构的指针”。 我的问题是: 如果我们想要一个指向结构的指针(即container_type),我们可以直接分配,对吧? 那为什么其中一个字段的指针被用来为整个结构分配地址? 任何人都可以用一个例子解释使用该宏的优势吗?

为什么i2c_smbusfunction不可用? (I2C – 嵌入式Linux)

在开发嵌入式Linux软件以在I2C总线上进行通信时,有许多参考使用i2c_smbus_函数。 当在软件项目中引用i2c_smbus函数(例如i2c_smbus_read_word_data)时, ARM8处理器错误(如“ i2c_smbus_read_word_data”)未在此范围内声明,则在编译时生成。 对以下头文件的研究表明缺少大多数i2c_smbus函数定义。 /usr/arm-linux-gnueabi/include/linux/i2c.h /usr/arm-linux-gnueabi/include/linux/i2c-dev.h 同样在以下参考i2c.h文件中定义了所有i2c_smbus。 如何解决这个问题? 研究参考 在Linux中使用来自用户空间的I2C Linux用户空间的I2C通信 – 第二部分 I2C开发接口

Spidev不使用ioctl同时写/读

我希望找到一些帮助,即使这个问题可能是硬件而不是软件相关(我们会看到)。 我正在开发基于Freescales P1021处理器(ppc,e500v2核心)的定制电路板。 外部PCB将连接并可由SPI配置。 该外部PCB的规格读取为全双工模式下的2字节命令,并且只有最后一个字节用于在MISO上传输数据。 知道这一点,我目前正在准备一些软件来测试这个设备。 所以我从众所周知的spi_test程序开始。 root@p1021rdb:~# ./spi_test -D /dev/spidev32766.3 spi mode: 0 bits per word: 8 max speed: 500000 Hz (500 KHz) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 […]

通过套接字文件描述符上的ioctl调用获取数据包时间戳

我正在研究运行嵌入式Linux的系统。 我正在尝试从我在套接字上收到的流中获取数据包时间戳。 创建套接字后,我执行以下操作: if (fd != -1) { int enabled = 1; setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &enabled, sizeof(enabled); } 之后我绑定套接字,套接字的类型为SOCK_STREAM。 我通过调用函数recv(fd, buf, size, 0)成功接收套接字上的数据。 现在,为了获取接收数据的时间戳,我目前正在尝试以下方法: ret = recv(fd, buf, size, 0); if (ret > 0) { struct timeval tv_ioctl; tv_ioctl.tv_sec = 0; tv_ioctl.tv_usec = 0; int error = ioctl(fd, SO_TIMESTAMP, &tv_ioctl); printf(“%ld.%ld – error = %d”, […]

使用可装入内核模块修改framebuffer(/ dev / graphics / fb0)参数

问题:我必须配置Android平台使用的各种LCD显示器。 几乎在所有情况下,没有可用于LCD显示器的电气规格。 但通过经验和逆向工程,可以很好地猜测参数。 我正在尝试使用可加载内核模块来微调显示参数(欢迎任何其他建议)。 请在下面找到相关信息。 HW: Atmel SAMA5D31-EK(ARM 5处理器) SW:来自board-dt.c文件的Andriod Linux(目标),Ubuntu(主机系统),Sourcery CodeBench(交叉编译器)代码片段 static struct fb_videomode at91_tft_vga_modes[] = { ….. .xres =435; .yres =235; …. } static struct fb_monspecs at91fb_default_monspecs = { ……… .modedb = at91_tft_vga_modes, …… } static struct atmel_lcd_fb_info __initdata ek_lcdc_data = { ………. .default_monspecs = & at91fb_default_monspecs; ……… } 我添加了此代码,以便可加载内核模块可以访问lcdc_data结构 extern void set_fb_video(struct […]

在arm-linux中打印堆栈跟踪

我按照这篇文章打印堆栈跟踪如何在我的gcc C ++应用程序崩溃时生成堆栈跟踪。 它在x86 linux中运行良好。 谁能教我如何让它在arm-linux上运行? 我正在使用arm-linux-gcc 4.4.3。 [root@FriendlyARM /]# ./test1 Error: signal 11: [0x0] 在x86中 mickey@mickeyvm:~/Desktop/workspace/test/testCatchSeg/src$ ./test1 Error: signal 11: ./test1(_Z7handleri+0x19)[0x804876d] [0xedd400] ./test1(_Z3bazv+0x10)[0x80487c2] ./test1(_Z3barv+0xb)[0x80487e1] ./test1(_Z3foov+0xb)[0x80487ee] ./test1(main+0x22)[0x8048812] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x84de37] ./test1[0x80486c1] 这就是我为arm-linux编译的方法 arm-linux-g++ -g -rdynamic ./testCatchSeg.cpp -o testCatchSeg

使用C的Beaglebone黑色PWM

我在C中为beaglebone black写了一个示例pwm函数。 每当我在其他模块或main()中进行函数调用时,我最终都会出现分段错误。 请帮助我犯错误以及如何处理这个问题。 以下是代码。 int trigger_pwm_output(unsigned input_no ) { FILE *pwm,*duty,*period,*run;“ uint16_t input=0; uint8_t input_no=0,input_state=0; unsigned int duty_cycle =500000; pwm = fopen(“/sys/devices/bone_capemgr.9/slots”, “w”); fseek(pwm,0,SEEK_SET); fprintf(pwm,”am33xx_pwm”); fflush(pwm); switch(input_no) { case 0: fprintf(pwm,”bone_pwm_P8_13″); fflush(pwm); period = fopen(“/sys/devices/ocp.3/pwm_test_P8_13.15/period”, “w”); fseek(period,0,SEEK_SET); fprintf(period,”%d”,500000); fflush(period); duty = fopen(“/sys/devices/ocp.3/pwm_test_P8_13.15/duty”, “w”); fseek(duty,0,SEEK_SET); run = fopen(“/sys/devices/ocp.3/pwm_test_P8_13.15/run”, “w”); fseek(run,0,SEEK_SET); fprintf(run,”%d”,0); fflush(run); fseek(run,0,SEEK_SET); count++; do […]

擦除Flash NOR:ioctl(MEMUNLOCK)返回状态?

我正试图用C语言中的Linux MTD驱动程序擦除NOR闪存…… 我对ioctl(MEMUNLOCK)调用的返回状态感到困惑,即使ioctl(MEMERASE)成功后它也会返回错误。 以下代码显示警告消息但有效(即Flash块已被删除): int erase_MTD_Pages(int fd, size_t size, off_t offset) { mtd_info_t mtd_info; erase_info_t ei; ioctl(fd, MEMGETINFO, &mtd_info); ei.length = mtd_info.erasesize; for(ei.start = offset; ei.start < (offset+size); ei.start += mtd_info.erasesize) { if(ioctl(fd, MEMUNLOCK, &ei) < 0) { // logPrintf(FAILURE, "[Flash] Can not unlock MTD (MEMUNLOCK, errno=%d)!\n", errno); // return RETURN_FILE_ERROR; logPrintf(WARNING, "[Flash] Can not […]

device_register和driver_register之间的区别

我正在写一个UART驱动程序。 我在第14章.Linux设备模型中遇到了两个函数。 int device_register(struct device *dev); int driver_register(struct device_driver *drv); 由于UART是一个char驱动程序,我使用( alloc_chrdev_region)动态创建了主要数字,并使用cdevadd()将设备添加到内核。 我在omap-serial.c中遇到了uart_register_driver()和platform_driver_register() 。 我可以使用platform_driver_register()映射driver_register ,但是uart_register_driver与tty相关函数映射。因为我是初学者,我不想使用tty相关函数。 uart_register_driver与uart_register_driver device_driver()吗? 请解释。

如何将Linux内核驱动程序模块添加为Buildroot包?

我目前正在为Xilinx的Zybo Board构建嵌入式Linux。 为此,我使用Buildroot。 现在我想添加一个用C语言编写的驱动程序 ,用户程序可以使用该驱动程序写入某些特定的寄存器,使其能够控制某些LED。 当我查看手册时 ,它基本上说首先要做的是在新的包文件夹中创建一个Config.in,在那里你可以写一些文字来解释驱动程序。 好的,我做到了。 但是现在makefile:我不太明白那里需要什么。 它只是一个像gcc -o ledcontrol hellofunc.c这样的编译命令吗? 除了Config.in和Makefile之外,我还需要做些什么吗?