gpt4 book ai didi

linux - 使用 libraw1394 进行内存访问

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:32 25 4
gpt4 key购买 nike

我发现 Linux 不支持我的尼康 LS-9000 ED 扫描仪 SANE并决定使用 Linux Firewire 内核 API 制作我自己的驱动程序 libraw1394 .

Library Programs and Command API Specifications扫描仪最近由尼康发布。扫描仪使用 Serial Bus Protocol 2 (SBP-2) 和 IEEE Std 1394-1995标准。

我用 libraw1394 制作了一个简单的测试程序,发现我无法读取(或写入)大多数 特定于串行总线的寄存器。阅读测试程序如下:

// gcc -Wall -o read read.c -l raw1394
#include <stdio.h>
#include <libraw1394/csr.h>
#include <libraw1394/raw1394.h>


int main()
{

raw1394handle_t handle;

handle = raw1394_new_handle_on_port(0);

printf("node: %X\n", raw1394_get_local_id(handle));


quadlet_t read;

for (int i = 0; i <= 1048576; i++) // 0 to 0x100000
{
int result = raw1394_read(handle,
raw1394_get_local_id(handle),
CSR_REGISTER_BASE + (i*4),
sizeof(quadlet_t),
&read);

if (result == 0)
printf("%X\n", i*4);
}

raw1394_destroy_handle(handle);

}

输出(缩写形式)是:

$ sudo ./read
node: FFC1
0
4
8
18
1C
200
204
210
218
21C
220
224
228
230
234
400 - 7FC
1000 - 13FC

这些偏移量不包括最重要的 MANAGEMENT_AGENT 寄存器,对于尼康 LS9000 ED,该寄存器位于 0x30000。我也无法写入到这个寄存器。

内核中一定有一种内存访问限制。如何将命令写入 MANAGEMENT_AGENT 寄存器,例如查询登录 ORB?

连接扫描仪之前:

$ lsmod | grep firewire
firewire_ohci 40960 0
firewire_core 65536 1 firewire_ohci
crc_itu_t 16384 1 firewire_core

$ dmesg | grep firewire
[ 0.776039] firewire_ohci 0000:03:00.0: added OHCI v1.10 device as card 0, 4 IR + 8 IT contexts, quirks 0x2
[ 1.276095] firewire_core 0000:03:00.0: created device fw0: GUID 000000000000017e, S400

扫描仪连接后:

$ lsmod | grep firewire
firewire_sbp2 24576 0
firewire_ohci 40960 0
firewire_core 65536 2 firewire_ohci,firewire_sbp2
crc_itu_t 16384 1 firewire_core

$ dmesg | grep firewire
[ 0.776039] firewire_ohci 0000:03:00.0: added OHCI v1.10 device as card 0, 4 IR + 8 IT contexts, quirks 0x2
[ 1.276095] firewire_core 0000:03:00.0: created device fw0: GUID 000000000000017e, S400
[ 3289.660782] firewire_core 0000:03:00.0: rediscovered device fw0
[ 3292.688185] firewire_core 0000:03:00.0: created device fw1: GUID 0090b54003ffffff, S400
[ 3292.688190] firewire_core 0000:03:00.0: phy config: new root=ffc0, gap_count=5
[ 3292.922459] firewire_sbp2 fw1.0: logged in to LUN 0000 (0 retries)

似乎内核模块 firewire_sbp2 在扫描仪连接时启动并且显然进行了登录。 firewire_sbp2 中的功能是否可以从应用程序中使用?

最佳答案

SBP2是一种通过 FireWire 传输 SCSI 命令的协议(protocol)。

在 Linux 中,您可以使用 SCSI Generic driver (sg) 向此类设备发送 SCSI 命令。

关于linux - 使用 libraw1394 进行内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47421031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com